Re: [問題] 一個 singleton? 的問題

看板java作者 (啪)時間11年前 (2013/12/29 20:46), 編輯推噓4(406)
留言10則, 6人參與, 最新討論串3/3 (看更多)
※ 引述《dream1124 (全新開始)》之銘言: : ※ 引述《qweqweqweqwe (啪)》之銘言: : : 各位板友好,最近遇到了一個跟 Singleton? 有關的問題想請教一下, : : 程式碼是憑印象大略打的,所以有誤的話還請見諒 QQ : : class Single { : : private Single mInstance; : : public static Single getInstance() { : : if (mInstance == null) { : : mInstance = new Single(); : : } : : return mInstance; : : } : 靜態方法呼叫類別的非靜態成員? 程式編譯應該過不了 : : private Single(){} : : public void reset() { : : mInstance = null; : : } : : } : reset 沒加 static 修飾詞,單例應該也沒辦法實現了吧.... 謝謝提醒,由於半夜突然想到這個問題,所以漏了許多地方非常不好意思, 已經在前文補上該有的內容, : NPE 是什麼意思? 我不太懂你是遇到什麼多執行緒問題 NPE是 nullpointer exception,抱歉沒有說明清楚 QQ 在公司常常用NPE當縮寫。 : 如果你是希望在有人 reset 之後呼叫 getInstance 的執行緒不會得到過時的物作 : 那你可以這樣寫 : public class SingletonTest { : private static SingletonTest instance = null; : public synchronized static SingletonTest getInstance(){ : if ( instance == null ){ : instance = new SingletonTest(); : return instance; : } : return instance; : } ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 不好意思,看到這段有個疑問,請問改寫成如下會有什麼不妥嗎? -------------------------------------------------------- public synchronized static SingletonTest getInstance(){ if ( instance == null ){ instance = new SingletonTest(); } return instance; } -------------------------------------------------------- : private SingletonTest(){ : } : public synchronized static void reset(){ : instance = new SingletonTest(); : } : } : 不需要額外創造一個 SYNC 物件然後在它上面同步, : 同歩在類別的方法上就可以了 另外看起來在 reset 別設成 null 取而代之的是重新 new Singleton 的方法 似乎可以解決 nullpointer exception 的問題,謝謝您的回應 QQ 小弟再思考思考。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.224.104.196

12/29 20:53, , 1F
NPE 這個用法還蠻通用的... 雖然我一開始也有點抗拒 XD
12/29 20:53, 1F

12/29 20:56, , 2F
你的寫法可以, 另外...reset有sync的話先null再new也ok
12/29 20:56, 2F

12/29 20:59, , 3F
恩恩 所以用SYNC這個物件只是多此一舉 但效果依樣?!
12/29 20:59, 3F

12/29 21:14, , 4F
直接assign new只有單個步驟 null再assign就兩步了
12/29 21:14, 4F

12/29 21:44, , 5F
可能要去公司看一下系統為什麼當初會先設 null QQ
12/29 21:44, 5F

12/29 22:25, , 6F
以前寫執行緒的痛苦經驗 建議使用double checked locking
12/29 22:25, 6F

12/29 22:27, , 7F
然後執行緒要確認該物件只有一個 降就行了
12/29 22:27, 7F

12/29 22:56, , 8F
不放心的話, instance再加上個 volatile 修飾詞應該也夠
12/29 22:56, 8F

12/30 19:20, , 9F
@danny重點是atomic,跟程式幾行無關,只有單行也可能分割
12/30 19:20, 9F

01/02 10:44, , 10F
用Guice A__A
01/02 10:44, 10F
文章代碼(AID): #1Im1c9W_ (java)
文章代碼(AID): #1Im1c9W_ (java)