作者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/m.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