[問題] 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