java 板


LINE

各位板友好,最近遇到了一個跟 Singleton? 有關的問題想請教一下, 程式碼是憑印象大略打的,所以有誤的話還請見諒 QQ class Single { private static Single mInstance; public static Single getInstance() { if (mInstance == null) { mInstance = new Single(); } return mInstance; } private Single(){} public static void reset() { mInstance = null; } } 這是一個簡單的 singleton,先忽略第一次 getInstance() thread safe的問題, 這個instance會在程式內被很頻繁的使用到, 當遇到某個特別的情況時, "必須"要把 call reset() 這個方法來讓 mInstance 重新 new, 但 call reset() 跟 call getInstance() 是不同的 thread, 由於是不同thread所以在 reset() 後 getInstance() 有機率造成 NPE, 所以我把 Single 程式稍微修改一下如下 SingleA class SingleA { private static SingleA mInstance; private static final Object SYNC = new Object(); public static SingleA getInstance() { synchronized(SYNC){ if (mInstance == null) { mInstance = new SingleA(); } } return mInstance; } private SingleA(){} public static void reset() { synchronized(SYNC){ mInstance = null; mInstance = new SingleA(); } } } 說到這裡,想請問的問題有幾個, 1. 想確認第一段程式碼中造成 NPE 是否真的是因為 thread unsafe的關係? (程式碼中都會把 getInstance 用一個 local variable 存起來, 例如 Single single = Single.getInstance(); ) 造成的原因是 thread 1 call getInstance 當通過 if(mInstance == null) 的判斷後 thread 2 call reset 所以導致 thread 1 最後 return null 嗎? 2. 如果問題一中我的推論是正確的 (也就是 npe 是 thread unsafe 造成的) 那請問 SingleA 這樣修改是正確(正確的定義是 thread safe) 的嗎? 3. 如果 SingleA 是 thread safe 的話,想請問有沒有其他更好的方法 可以達成呢?因為 getInstance() 會很頻繁的使用,所以不太希望 裡面會有 synchronized 。 如果有什麼不清楚的還請見諒 QQ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.114.160
1F:推 qrtt1:http://stackoverflow.com/a/16106598/90909 12/29 10:24
2F:→ qrtt1:有些東西自己寫容易錯的就儘管用抄的吧。 12/29 10:25
3F:→ qrtt1:如果不是維護舊東西,我大概都用 IoC Container 來做它。 12/29 10:27
QQ 但這是個數十萬行架構的程式碼 小弟把問題先簡化而已 在以前的情況下因為可以保證第一次new instance 是thread safe, 而且也不會把 instance 設成 null,所以以前沒遇到這種問題。 ※ 編輯: qweqweqweqwe 來自: 220.135.114.160 (12/29 12:58)
4F:→ qrtt1:可是寫法就不對了,至少 getInstance 要 static 啊 12/29 13:33
5F:→ qrtt1:而且還要加 synchronized (不考慮lazy initialization的話) 12/29 13:35
喔喔 不好意思忘了打上 static , 已經補上了謝謝提醒 另外上面有提到 系統第一次 Single.getInstance() 的 initialization 時"一定保證"是 thread safe , 所以原本的 Single.getInstance() 並不需要加上 synchronized。 ※ 編輯: qweqweqweqwe 來自: 220.135.114.160 (12/29 14:04) ※ 編輯: qweqweqweqwe 來自: 36.224.104.196 (12/29 20:29)
6F:推 qrtt1:回到最初的建議,這樣隨興寫太容易出錯了。有些東西只能抄的 12/30 11:47







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP