看板 java 關於我們 聯絡資訊
各位大大好,目前正在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://www.ptt.cc/bbs/java/M.1417746459.A.7F7.html ※ 編輯: v9290026 (60.245.65.179), 12/05/2014 10:38:45
ssccg: Class物件,每個類別會有一個由ClassLoader載入的 12/05 14:12
ssccg: 通常就跟getClass()回傳的是同一個 12/05 14:20
ssccg: synchronized static method一樣是鎖這個物件 12/05 14:26
v9290026: 第二句秒懂啊,感謝 12/05 14:26
v9290026: 所以鎖靜態method,因為不會宣告object,也是鎖該依附的cl 12/05 14:28
v9290026: ass意思嗎? 12/05 14:28
luoqr: 第一個if可能沒有用? 12/06 07:52
bitlife: 有用,避免未來非必要的進入 synchronized block 12/06 08:55
luoqr: 我也覺得有用 不過http://ppt.cc/5etP 好像可能沒用 12/08 21:23
luoqr: fortify之類的掃描原始碼工具還會把這種寫法當作有問題 @@ 12/08 21:24
luoqr: 但直覺得我是認為多判斷一次null好像比較快 @@ 12/08 21:24
ssccg: 要lazy init直接用static inner Holder那招比較好 12/09 10:39
ssccg: 由JVM/Classloader處理初始化,連檢查null都不用 12/09 10:42
Killercat: 你是說static區塊嘛?大多數的情況來講是對的 12/10 01:26