上一章说了,解决线程安全问题的实现方式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:否则,能使用同步代码块的尽量使用同步代码块