中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天、前天的一樣(過渡期的不考慮,別找茬哦),大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖:
單例模式最大的特點就是在類裡有乙個private
建構函式,保證這個類不被其他類
new出來。而
getinstence
是用來獲得此類唯一的有乙個例項化物件的方法。
經典的單例模式**:
@suppresswarnings("all")客戶端呼叫時,不能newpublic
class singletonpattern
public singletonpattern getinstance()
return
this.singletonpattern;
}}
出這個類的物件,只能通過
getinstence
是用來獲得此類唯一的有乙個例項化物件的方法,而
getinstence
裡有句關於類中靜態成員變數
singletonpattern
的存在判斷,保證其唯一性。
當然這個例子有個很不完善的地方,就是遇到多執行緒問題時,假如現在有兩個執行緒a
和執行緒b
,執行緒a
執行到
this.singletonpattern = new singletonpattern()
,正在申請記憶體分配,可能需要
0.001
微秒,就在這
0.001
微秒之內,執行緒
b執行到
if(this.singletonpattern == null)
,你說這個時候這個判斷條件是
true
還是false
?是true
,那然後呢?執行緒
b也往下走,於是乎就在記憶體中就有兩個
singletonpattern
的例項了,看看是不是出問題了?
如果你這個單例是去拿乙個序列號或者建立乙個訊號資源的時候,會怎麼樣?業務邏輯混亂!資料一致性校驗失敗!最重要的是你從**上還看不出什麼問題,這才是最要命的!因為這種情況基本上你是重現不了的,不寒而慄吧,那怎麼修改?有很多種方案,我就說一種,能簡單的、徹底解決問題的方案:
@suppresswarnings("all")直接new乙個物件傳遞給類的成員變數singletonpattern,你要的時候getinstance()直接返回給你,解決問題!public
class singletonpattern
public
synchronized
static singletonpattern getinstance()
}
另外,如果你不想singletonpattern
乙個初始值,也可以通過synchronized關鍵字宣告getinstence方法,保證只有乙個執行緒訪問此方法來解決。
單例模式小記 原創
中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天 前天的一樣 過渡期的不考慮,別找茬哦 大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖 單例模式最大的...
命令模式小記 原創
接下來講命令模式,這個模式從名字上看就很簡單,命令嘛,老大發命令,小兵執行就是了,確實是這個意思,但是更深化了,用模式來描述真是是世界的命令情況。我們就以專案組為例子來講述命令模式。專案的成員分工也是採用了常規的分工方式,分為需求組 requirement group,簡稱rg 美工組 page g...
Qt 下 Singleton單例模式小記
singleton 單件 模式的意圖是 保證類僅有乙個例項,並提供乙個訪問它的全域性訪問點。應用於多執行緒環境的 singleton 模式又叫做 double checked locking 雙重檢查鎖定 模式。include include include class singleton publ...