單例模式小記 原創

2021-09-08 03:02:01 字數 1607 閱讀 5082

中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天、前天的一樣(過渡期的不考慮,別找茬哦),大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖:

單例模式最大的特點就是在類裡有乙個private

建構函式,保證這個類不被其他類

new出來。而

getinstence

是用來獲得此類唯一的有乙個例項化物件的方法。

經典的單例模式**:

@suppresswarnings("all")

public

class singletonpattern

public singletonpattern getinstance()

return

this.singletonpattern;

}}

客戶端呼叫時,不能new

出這個類的物件,只能通過

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")

public

class singletonpattern

public

synchronized

static singletonpattern getinstance()

}

直接new乙個物件傳遞給類的成員變數singletonpattern,你要的時候getinstance()直接返回給你,解決問題!

另外,如果你不想singletonpattern 

乙個初始值,也可以通過synchronized關鍵字宣告getinstence方法,保證只有乙個執行緒訪問此方法來解決。

單例模式小記 原創

中國的歷史上很少出現兩個皇帝並存的時期,是有,但不多,那我們就認為皇帝是個單例模式,在這個場景中,有皇帝,有大臣,大臣是天天要上朝參見皇帝的,今天參拜的皇帝應該和昨天 前天的一樣 過渡期的不考慮,別找茬哦 大臣磕完頭,抬頭一看,嗨,還是昨天那個皇帝,單例模式,絕對的單例模式,先看類圖 單例模式最大的...

命令模式小記 原創

接下來講命令模式,這個模式從名字上看就很簡單,命令嘛,老大發命令,小兵執行就是了,確實是這個意思,但是更深化了,用模式來描述真是是世界的命令情況。我們就以專案組為例子來講述命令模式。專案的成員分工也是採用了常規的分工方式,分為需求組 requirement group,簡稱rg 美工組 page g...

Qt 下 Singleton單例模式小記

singleton 單件 模式的意圖是 保證類僅有乙個例項,並提供乙個訪問它的全域性訪問點。應用於多執行緒環境的 singleton 模式又叫做 double checked locking 雙重檢查鎖定 模式。include include include class singleton publ...