Android(java)学习笔记68:同步代码块的锁和同步方法的应用

  1 package cn.itcast_11;
  2
  3 public class SellTicket implements Runnable {
  4
  5     // 定义100张票
  6     private static int tickets = 100;
  7
  8     // 定义同一把锁
  9     private Object obj = new Object();
 10     private Demo d = new Demo();
 11
 12     private int x = 0;
 13
 14     //同步代码块用obj做锁
 15 //    @Override
 16 //    public void run() {
 17 //        while (true) {
 18 //            synchronized (obj) {
 19 //                if (tickets > 0) {
 20 //                    try {
 21 //                        Thread.sleep(100);
 22 //                    } catch (InterruptedException e) {
 23 //                        e.printStackTrace();
 24 //                    }
 25 //                    System.out.println(Thread.currentThread().getName()
 26 //                            + "正在出售第" + (tickets--) + "张票 ");
 27 //                }
 28 //            }
 29 //        }
 30 //    }
 31
 32     //同步代码块用任意对象做锁
 33 //    @Override
 34 //    public void run() {
 35 //        while (true) {
 36 //            synchronized (d) {
 37 //                if (tickets > 0) {
 38 //                    try {
 39 //                        Thread.sleep(100);
 40 //                    } catch (InterruptedException e) {
 41 //                        e.printStackTrace();
 42 //                    }
 43 //                    System.out.println(Thread.currentThread().getName()
 44 //                            + "正在出售第" + (tickets--) + "张票 ");
 45 //                }
 46 //            }
 47 //        }
 48 //    }
 49
 50     @Override
 51     public void run() {
 52         while (true) {
 53             if(x%2==0){
 54                 synchronized (SellTicket.class) {//synchronized (this)-------表示非同步方法的锁对象判定
 55                     if (tickets > 0) {
 56                         try {
 57                             Thread.sleep(100);
 58                         } catch (InterruptedException e) {
 59                             e.printStackTrace();
 60                         }
 61                         System.out.println(Thread.currentThread().getName()
 62                                 + "正在出售第" + (tickets--) + "张票 ");
 63                     }
 64                 }
 65             }else {
 66 //                synchronized (d) {
 67 //                    if (tickets > 0) {
 68 //                        try {
 69 //                            Thread.sleep(100);
 70 //                        } catch (InterruptedException e) {
 71 //                            e.printStackTrace();
 72 //                        }
 73 //                        System.out.println(Thread.currentThread().getName()
 74 //                                + "正在出售第" + (tickets--) + "张票 ");
 75 //                    }
 76 //                }
 77
 78                 sellTicket();
 79
 80             }
 81             x++;
 82         }
 83     }
 84
 85 //    private void sellTicket() {
 86 //        synchronized (d) {
 87 //            if (tickets > 0) {
 88 //            try {
 89 //                    Thread.sleep(100);
 90 //            } catch (InterruptedException e) {
 91 //                    e.printStackTrace();
 92 //            }
 93 //            System.out.println(Thread.currentThread().getName()
 94 //                        + "正在出售第" + (tickets--) + "张票 ");
 95 //            }
 96 //        }
 97 //    }
 98
 99     //如果一个方法一进去就看到了代码被同步了,那么我就再想能不能把这个同步加在方法上呢?
100 //     private synchronized void sellTicket() {
101 //            if (tickets > 0) {
102 //            try {
103 //                    Thread.sleep(100);
104 //            } catch (InterruptedException e) {
105 //                    e.printStackTrace();
106 //            }
107 //            System.out.println(Thread.currentThread().getName()
108 //                        + "正在出售第" + (tickets--) + "张票 ");
109 //            }
110 //    }
111
112     private static synchronized void sellTicket() {
113         if (tickets > 0) {
114         try {
115                 Thread.sleep(100);
116         } catch (InterruptedException e) {
117                 e.printStackTrace();
118         }
119         System.out.println(Thread.currentThread().getName()
120                     + "正在出售第" + (tickets--) + "张票 ");
121         }
122 }
123 }
124
125 class Demo {
126 }
 1 package cn.itcast_11;
 2
 3 /*
 4  * A:同步代码块的锁对象是谁呢?
 5  *         任意对象。
 6  *
 7  * B:同步方法的格式及锁对象问题?
 8  *         把同步关键字加在方法上。
 9  *
10  *         同步方法的锁对象是谁呢?
11  *             this
12  *
13  * C:静态方法及锁对象问题?
14  *         静态方法的锁对象是谁呢? (静态方法是随着类的加载而加载的,所以它的锁对象要先于它之前出现,只能是.class文件,逻辑上很好理解)15  *             类的字节码文件对象。
16  */
17 public class SellTicketDemo {
18     public static void main(String[] args) {
19         // 创建资源对象
20         SellTicket st = new SellTicket();
21
22         // 创建三个线程对象
23         Thread t1 = new Thread(st, "窗口1");
24         Thread t2 = new Thread(st, "窗口2");
25         Thread t3 = new Thread(st, "窗口3");
26
27         // 启动线程
28         t1.start();
29         t2.start();
30         t3.start();
31     }
32 }
时间: 2024-10-09 00:14:15

Android(java)学习笔记68:同步代码块的锁和同步方法的应用的相关文章

Java学习笔记四(代码块 )

1 代码块的分类:java中的代码块是指使用{}括起来的一段代码,根据位置不同可以分为四种: 普通代码块 构造快 静态代码块 同步代码块 今天主要学习前三种代码块,同步代码块在学习到多线程部分的时候再加学习. 2 普通代码块:直接定义在方法中的代码块,如下: public class CodeSpace { public static void main(String args[]){ { int x = 30; System.out.println("普通代码块x="+x); } /

Java线程安全与同步代码块

因为在电商网站工作的原因,对于秒杀.闪购等促销形式相当熟悉.无外乎商家拿出一定量的库存去做所谓的"亏本买卖",其目的是用有限的库存去吸引无限的流量.然而,我却碰到过因为系统问题,导致秒杀品超卖的情况.可怜的商户其实只提供了10双9.9元的童鞋做秒杀,却在瞬间内卖出了1000双! 类似这样的问题,在非线程安全的程序设计中十分常见,我们下面运行一个秒杀的程序: public class SalesThread implements Runnable { private int stock

Java学习笔记---多线程同步的五种方法

一.引言 前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊.闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常.举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块.假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说清楚.因此多线程同步就

java学习笔记 线程同步

在实现Runnable接口后,可以通过多个start方法来调用同一段代码资源,这也会导致一个问题就是资源可能不同步. 解决资源不同步的方法是,在同一时间段内,只允许一个线程来操作这个对象或方法,其他线程需等待此线程访问结束后才能继续执行,将其锁住. 关键字synchronized:表示只能有一个线程执行synchronized所声明的代码块或方法,并且在执行过程中其他方法不能锁定这个对象 .使用方式有同步代码块与同步方法,两者功能一样. 只能有一个同步方法访问该对象,其他方法若是同步的则不能访问

Java的synchronized的同步代码块和同步方法的区别

线程同步问题大都使用synchronized解决,有同步代码块和同步方法的两种方式,主要记一下这两种的区别 测试代码: 1 package com.xujingyang.testThread; 2 3 public class SynObj{ 4 public synchronized void showA(){ 5 System.out.println("showA.."); 6 try { 7 Thread.sleep(3000); 8 } catch (InterruptedEx

iOS学习笔记-协议,代码块,分类

在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法.熟悉面向对象的童鞋都知道接口本身是对象行为描述的协议规范.也就是说在ObjC中@protocol和其他语言的接口定义是类似的,只是在ObjC中interface关键字已经用于定义类了,因此它不会再像C#.Java中使用interface定义接口了. 假设我们定义了一个动物的协议AnimalDelegate,人员Person这个类需要实现这个协议,请看下面的代码: AnimalDelegate.h // // A

JAVA高并发程序设计学习:Synchronized同步代码块具体使用方法

多线程同时对资源进行访问时,同步机制使得同一时间内只能有一个线程对资源进行操作. 同步机制可以用Synchronized实现. 当Synchronized修饰一个方法的时候,该方法称为同步方法. 当Synchronized方法执行完成或者异常时会释放锁. 会有同学对synchronized修饰方法,静态方法,对象时具体对哪些东西加锁不是很明白,这里会进行详细的讲解. synchronized修饰方法时,会对类实例进行加锁,该实例的所有synchronized方法必须等当前锁释放后才能访问. sy

java中使用wait就得使用同步锁,而且2个线程必须都使用同步代码块,否则就会异常

标题已经说明,子线程wai()时候默认的锁不是同步代码块的锁,因此wai时候显示的指明锁,现在解释看code: public class Test { // static boolean flag=true; public static void main(String[] args) throws InterruptedException { Zp z=new Zp(); Thread st=new Thread(z); st.start(); for(int x=0;x<100000;x++

java 同步代码块与同步方法

同步代码块 synchronized (obj) { // 代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是执行代码,即是某个方法中的某一部分代码,synchronized(obj){}只能出现在某个方法中.如: public void test() { synchronized (obj) { // 代码块 } } 而不能出现在其他位置,如下则报错: public class Test { public