單例是保證乙個記憶體/程序裡只有乙個類的例項,並提供乙個訪問它的全域性訪問點。
唯一例項
因為單例模式的作用就是產生唯一的例項,所以我們只要判斷為空的時候建立物件即可。
public
class singleton
return msingleton;
}}
執行緒安全
上面這種情況如果遇到在兩個執行緒裡面同時執行的話,第乙個執行緒剛執行完第四行還沒執行到第五行,這時候第二個執行緒也執行到第四行,它會發現這個msingleton仍然為空,第二個執行緒也很絕望啊,它弱弱的說我選擇原諒她。
這時候我們加乙個同步的鎖就可以防止這種情況。
public
class singleton
return msingleton;
}}
效能優化
上面這個栗子雖然是老鐵沒毛病,但是我們每次執行這個getinstance()
方法都受到同步鎖的困擾,導致效率低,同步鎖的作用應該是建立物件時期用的,所以我們把這個synchronized
挪下位置。
public
class singleton }}
return msingleton;
}}
這樣只有singleton
沒有被建立的時候才會執行第四行,然後再加上同步鎖,這樣效率上會有所提公升。這種方法叫做雙重鎖定(double-check locking)
防止序列化產生新物件
這段**看起來很完美,很可惜,它是有問題。主要在於instance = new singleton()這句,這並非是乙個原子操作,事實上在 jvm 中這句話大概做了下面 3 件事情。給 instance 分配記憶體
呼叫 singleton 的建構函式來初始化成員變數
將instance物件指向分配的記憶體空間(執行完這步 instance 就為非 null 了)
但是在 jvm 的即時編譯器中存在指令重排序的優化。也就是說上面的第二步和第三步的順序是不能保證的,最終的執行順序可能是 1-2-3 也可能是 1-3-2。如果是後者,則在 3 執行完畢、2 未執行之前,被執行緒二搶占了,這時 instance 已經是非 null 了(但卻沒有初始化),所以執行緒二會直接返回 instance,然後使用,然後順理成章地報錯。
我們只需要將 instance 變數宣告成 volatile 就可以了。
public
class singleton
public
static singleton getinstance() }}
return msingleton;
}}
java設計模式 單例設計模式
public class main 餓漢式 空間換時間 多執行緒訪問不會建立多個物件 author admin class singleton 2建立本類物件 private static singleton s new singleton 3對外提供公共的訪問方法 public static si...
Java單例設計模式
單例設計模式也有人叫單態,基本上有兩種寫法一種是餓漢式,另外一種是懶漢式。餓漢式就是一開始就建立了例項物件 public class singleton public static singleton getintance 懶漢式是需要的時候才建立 它比較懶 而且會涉及執行緒同步問題,需要增加同步 ...
java 單例設計模式
單例設計模式 保證乙個類在記憶體中只有乙個物件。模式 模式就是解決 一類 問題的固定步驟 模式的概念最早起源於建築行業 建房子的步驟都是一樣子 打地基 澆柱子 蓋樓面 砌牆 封頂 裝修 入住軟體行業中23種設計模式 單例設計模式 模板設計模式 裝飾者設計模式 觀察者設計模式 工廠設計模式單例設計模式...