作者v9290026 (CH)
看板java
标题[问题] Singleton 双重检查锁请益
时间Fri Dec 5 10:27:37 2014
各位大大好,目前正在k Design Patten,
下面有一段code里面关於synchronized的部分想请教:
public class Singleton{
private volatile static Singleton uniqueInstance;
private Singleton(){}
public static Singleton getInstance(){
if(uniqeInstance == null){
synchronized(Singleton.class){
^^^^^^^^^^^^^^^^^
if(uniqeInstnace == null)
uniqueInstance = new Singleton();
}
}
}
}
对Synchronized block的观念比较薄弱,以前大部分都用this,
用来锁当前物件比较多,想请问这边的Singleton.class锁的是? 感谢!!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.245.65.179
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1417746459.A.7F7.html
※ 编辑: v9290026 (60.245.65.179), 12/05/2014 10:38:45
1F:→ ssccg: Class物件,每个类别会有一个由ClassLoader载入的 12/05 14:12
2F:→ ssccg: 通常就跟getClass()回传的是同一个 12/05 14:20
3F:→ ssccg: synchronized static method一样是锁这个物件 12/05 14:26
4F:→ v9290026: 第二句秒懂啊,感谢 12/05 14:26
5F:→ v9290026: 所以锁静态method,因为不会宣告object,也是锁该依附的cl 12/05 14:28
6F:→ v9290026: ass意思吗? 12/05 14:28
7F:→ luoqr: 第一个if可能没有用? 12/06 07:52
8F:→ bitlife: 有用,避免未来非必要的进入 synchronized block 12/06 08:55
10F:→ luoqr: fortify之类的扫描原始码工具还会把这种写法当作有问题 @@ 12/08 21:24
11F:→ luoqr: 但直觉得我是认为多判断一次null好像比较快 @@ 12/08 21:24
12F:→ ssccg: 要lazy init直接用static inner Holder那招比较好 12/09 10:39
13F:→ ssccg: 由JVM/Classloader处理初始化,连检查null都不用 12/09 10:42
14F:→ Killercat: 你是说static区块嘛?大多数的情况来讲是对的 12/10 01:26