java 22 - 13 多线程之解决线程安全问题的实现方式2

上一章说了,解决线程安全问题的实现方式1是使用同步代码块

同时也知道了,同步代码块的锁对象是任意对象:(Object obj ;  Demo d;)这些都行

 

那么,现在来说解决线程安全问题的实现方式2

同步方法:(一个方法一进去就看到代码被同步了的情况下考虑使用)

  把同步关键字synchronized添加到方法上

那么,同步方法的锁对象是什么呢?

  是this

如果这个同步方法是静态方法,那么这个静态同步方法的锁对象是什么呢?

  是类的字节码文件对象(反射中会讲解)

  现在演示的例子中,这个类的字节码文件对象是SellTicket.class

 

代码例子:

  

 1 public class SellTicket implements Runnable {
 2     // 定义100张票
 3     private int ticket = 100;
 4     
 5     //定义同一把锁
 6     private Object obj = new Object();
 7     
 8     
 9     public synchronized void run() {
10         
11         //假设一直在售票
12         while(true){
13         //现实中买票时,都会有延迟的,所以让线程休息下
14         try {
15             Thread.sleep(100);
16         } catch (InterruptedException e) {
17             e.printStackTrace();
18         }
19         if(ticket > 0){
20             System.out.println(Thread.currentThread().getName()+"正在出售第"+(ticket--)+"张票");
21         }
22     }
23     }

结果跟方式1的一样

 

那么,方式1和方式2,使用哪个?

  A:如果锁对象是this,就可以考虑使用同步方法(一个方法一进去就看到了代码被同步了)

  B:否则,能使用同步代码块的尽量使用同步代码块

 

posted @ 2016-10-07 17:37  卡拉瓦  阅读(416)  评论(0编辑  收藏  举报