[問題] Singleton 雙重檢查鎖請益

看板java作者 (CH)時間10年前 (2014/12/05 10:27), 10年前編輯推噓1(1013)
留言14則, 5人參與, 最新討論串1/1
各位大大好,目前正在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

12/05 14:12, , 1F
Class物件,每個類別會有一個由ClassLoader載入的
12/05 14:12, 1F

12/05 14:20, , 2F
通常就跟getClass()回傳的是同一個
12/05 14:20, 2F

12/05 14:26, , 3F
synchronized static method一樣是鎖這個物件
12/05 14:26, 3F

12/05 14:26, , 4F
第二句秒懂啊,感謝
12/05 14:26, 4F

12/05 14:28, , 5F
所以鎖靜態method,因為不會宣告object,也是鎖該依附的cl
12/05 14:28, 5F

12/05 14:28, , 6F
ass意思嗎?
12/05 14:28, 6F

12/06 07:52, , 7F
第一個if可能沒有用?
12/06 07:52, 7F

12/06 08:55, , 8F
有用,避免未來非必要的進入 synchronized block
12/06 08:55, 8F

12/08 21:23, , 9F
我也覺得有用 不過http://ppt.cc/5etP 好像可能沒用
12/08 21:23, 9F

12/08 21:24, , 10F
fortify之類的掃描原始碼工具還會把這種寫法當作有問題 @@
12/08 21:24, 10F

12/08 21:24, , 11F
但直覺得我是認為多判斷一次null好像比較快 @@
12/08 21:24, 11F

12/09 10:39, , 12F
要lazy init直接用static inner Holder那招比較好
12/09 10:39, 12F

12/09 10:42, , 13F
由JVM/Classloader處理初始化,連檢查null都不用
12/09 10:42, 13F

12/10 01:26, , 14F
你是說static區塊嘛?大多數的情況來講是對的
12/10 01:26, 14F
文章代碼(AID): #1KWHWRVt (java)
文章代碼(AID): #1KWHWRVt (java)