上一章说了,解决线程安全问题的实现方式1是使用同步代码块
同时也知道了,同步代码块的锁对象是任意对象:(Object obj ; Demo d;)这些都行
那么,现在来说解决线程安全问题的实现方式2
同步方法:(一个方法一进去就看到代码被同步了的情况下考虑使用)
把同步关键字synchronized添加到方法上
那么,同步方法的锁对象是什么呢?
是this
如果这个同步方法是静态方法,那么这个静态同步方法的锁对象是什么呢?
是类的字节码文件对象(反射中会讲解)
现在演示的例子中,这个类的字节码文件对象是SellTicket.class
代码例子:
public class SellTicket implements Runnable {
// 定义100张票
private int ticket = 100; //定义同一把锁
private Object obj = new Object(); public synchronized void run() { //假设一直在售票
while(true){
//现实中买票时,都会有延迟的,所以让线程休息下
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(ticket > 0){
System.out.println(Thread.currentThread().getName()+"正在出售第"+(ticket--)+"张票");
}
}
}
结果跟方式1的一样
那么,方式1和方式2,使用哪个?
A:如果锁对象是this,就可以考虑使用同步方法(一个方法一进去就看到了代码被同步了)
B:否则,能使用同步代码块的尽量使用同步代码块