多线程synchronized三种使用方式
一(灵活、对象锁)、synchronized(){}以同步代码块的形式使用时应注意:
1、线程同步机制目的就是让线程排队执行
2、小括号里填的数据决定了让哪些线程同步执行大括号里的代码
3、每当有线程遇到synchronized(){}代码时:
首先要尝试获取小括号当中的对象锁,如果拿到了这个对象锁,就会占有这个锁不让其他线程获得这个锁,然后执行大括号中的代码。如果没有拿到小括号里面的对象锁,就会一直排队等待这把锁,直到拿到这个锁再占有它并执行大括号中的代码。
二(不灵活、对象锁)、在实例方法上使用synchronized:
1、此时一定锁的是this
2、整个方法体都被同步了,可能会无故扩大同步的范围,导致程序的执行效率降低。
3、举例
public synchronized void withdraw(double money){
....
}
三(类锁)、在静态方法上使用synchronized:
1、表示找类锁。
2、作用:保证静态变量的安全
3、类锁和对象锁的区别:
1个对象对应1把锁,100个对象100把锁;
1个类对应1把锁,就算这个类创建了n个对象,类锁也就这一把。