synchronized小结
1.介绍
synchronized(英)-->同步(中)
同步作用:是为了防止多个线程访问同一数据对象,对数据对象造成损害。
2.用法
| 全局锁(类锁) | 对象锁 | |
| synchronized方法 | 有static关键字 | 无static关键字,取得对象锁 |
| synchronized块 | 括号里为XX.class,或静态成员变量 | 括号里为this,或者非静态变量 |
当一个线程访问synchronized修饰的方法或代码块时,根据表中条件获取对应的锁进入。其他线程若想访问其他同步方法,必须判断其他同步方法需要的是什么锁。
3.类比
①线程就像是进入大楼里的游客,有synchronized修饰的方法为带锁房间(对象锁和全局锁),synchronized修饰的代码块为房间里的带锁屏风(锁同前者),都必须只能一个游客进入访问。其他无synchronized修饰的房间为不需要钥匙的房间和无锁屏风,可以多个游客进入。
②只有两把钥匙,对象钥匙和全局钥匙。
③一旦第一个游客A访问配有对象锁的房间或屏风没有出来,第二个游客B只能访问配有全局锁或没有锁的房间和屏风。剩下的游客因为没有钥匙,只能等A和B出来再竞争钥匙,才能访问同步方法。也可以不等A和B直接应需要访问非同步方法。
4.缺陷
synchronized方法过多使用保证了安全,但也牺牲了效率,尽量使用synchronized块减少不必要的效率损失。
如单例模式懒汉模式的优化代码中,
public class Single {
private static Single single = null;
private Single() {
}
public Single getInstance() {
if (single == null) {
synchronized (Single.class) {
if (single == null) {
single = new Single();
}
}
}
return single;
}
}
浙公网安备 33010602011771号