2.3 單例模式和執行緒安全
(1)預載入只有一條語句return instance,這顯然可以保證執行緒安全。但是,我們知道預載入會造成記憶體的浪費。
(2)懶載入不浪費記憶體,但是無法保證執行緒的安全。首先,if判斷以及其記憶體執行**是非原子性的。其次,new singleton()無法保證執行的順序性。
不滿足原子性或者順序性,執行緒肯定是不安全的,這是基本的常識,不再贅述。我主要講一下為什麼new singleton()無法保證順序性。我們知道建立乙個物件分三步:
memory=allocate();//1:初始化記憶體空間
ctorinstance(memory);//2:初始化物件
instance=memory();//3:設定instance指向剛分配的記憶體位址
jvm為了提高程式執行效能,會對沒有依賴關係的**進行重排序,上面2和3行**可能被重新排序。我們用兩個執行緒來說明執行緒是不安全的。執行緒a和執行緒b都建立物件。其中,a2和a3的重排序,將導致執行緒b在b1處判斷出instance不為空,執行緒b接下來將訪問instance引用的物件。此時,執行緒b將會訪問到乙個還未初始化的物件(執行緒不安全)。
我們首先想到的就是使用synchronized關鍵字。synchronized載入getinstace()函式上確實保證了執行緒的安全。但是,如果要經常的呼叫getinstance()方法,不管有沒有初始化例項,都會喚醒和阻塞執行緒。為了避免執行緒的上下文切換消耗大量時間,如果物件已經例項化了,我們沒有必要再使用synchronized加鎖,直接返回物件。
3 生成器模式
定義:封裝乙個複雜物件構造過程,並允許按步驟構造。
定**釋: 我們可以將生成器模式理解為,假設我們有乙個物件需要建立,這個物件是由多個元件(component)組合而成,每個元件的建立都比較複雜,但運用元件來建立所需的物件非常簡單,所以我們就可以將構建複雜元件的步驟與運用元件構建物件分離,使用builder模式可以建立。
設計模式 單例模式和執行緒安全
餓漢模式 例項在類載入的時候就建立好。直接上 兩種實現方式。兩種實現方式因為都是在類載入的時候就例項化好的,所以是執行緒安全的。餓漢模式 單例例項在類裝載時進行建立 執行緒安全 public class singletonexample2 單例物件 private static singletone...
c 多執行緒單例模式 執行緒安全C 單例模式
我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...
設計模式 單例模式(執行緒安全)
前言 單例模式是設計模式中比較簡單的一種,但是又因為簡單常見在面試中又是經常出現的乙個設計模式。所以必須要會啊。之前也只是會寫執行緒不安全的單例模式。單例模式 乙個類能返回物件乙個引用 永遠是同乙個 和乙個獲得該例項的方法 必須是靜態方法,通常使用getinstance這個名稱 當我們呼叫這個方法時...