[问题] Singleton 双重检查锁请益

楼主: v9290026 (CH)   2014-12-05 10:27:37
各位大大好,目前正在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锁的是? 感谢!!
作者: ssccg (23)   2014-12-05 14:12:00
Class物件,每个类别会有一个由ClassLoader加载的通常就跟getClass()回传的是同一个synchronized static method一样是锁这个物件
楼主: v9290026 (CH)   2014-12-05 14:26:00
第二句秒懂啊,感谢所以锁静态method,因为不会宣告object,也是锁该依附的class意思吗?
作者: luoqr (.....)   2014-12-06 07:52:00
第一个if可能没有用?
作者: bitlife (BIT一生)   2014-12-06 08:55:00
有用,避免未来非必要的进入 synchronized block
作者: luoqr (.....)   2014-12-08 21:23:00
我也觉得有用 不过http://ppt.cc/5etP 好像可能没用fortify之类的扫描原始码工具还会把这种写法当作有问题 @@但直觉得我是认为多判断一次null好像比较快 @@
作者: ssccg (23)   2014-12-09 10:39:00
要lazy init直接用static inner Holder那招比较好由JVM/Classloader处理初始化,连检查null都不用
作者: Killercat (杀人猫™)   2014-12-10 01:26:00
你是说static区块嘛?大多数的情况来讲是对的

Links booklink

Contact Us: admin [ a t ] ucptt.com