java單例模式的正確寫法

2021-09-02 15:13:19 字數 2093 閱讀 3450

一、懶漢式(執行緒不安全)

public class singleton 

public static singleton getinstance()

return instance;

}}

介紹:執行緒不安全,在多執行緒情況下容易建立多個例項。

二、懶漢式(執行緒安全)

public static synchronized singleton getinstance() 

return instance;

}

介紹:雖然執行緒安全,但是不夠高效。

三、雙重檢驗鎖

public static singleton getsingleton() }}

return instance ;

}

介紹:雙重檢驗鎖機制比

懶漢式(執行緒安全)要高效很多,因為它不用對instance不為空的情況進行同步。這段**看起來似乎很完美,但很可惜,還是存在問題。instance=new singleton() 這並非是乙個原子性質的操作,事實上在jvm中做了如下三件事:

給instance分配記憶體

呼叫建構函式初始化成員變數

將instance物件指向分配的記憶體(此步驟完成instance即為非空)

但是在 jvm 的即時編譯器中存在指令重排序的優化。也就是說上面的第二步和第三步的順序是不能保證的,最終的執行順序可能是 1-2-3 也可能是 1-3-2。如果是後者,則在 3 執行完畢、2 未執行之前,被執行緒二搶占了,這時 instance 已經是非 null 了(但卻沒有初始化),所以執行緒二會直接返回 instance,然後使用,然後順理成章地報錯。

四、雙重檢驗鎖(volatile)

public class singleton 

public static singleton getsingleton() }}

return instance;

}}

介紹:使用 volatile 的原因是可以保證執行緒在本地不會存有 instance 的副本,每次都是去主記憶體中讀取。這裡使用volatile的乙個主要原因就是

volatile可以

禁止jvm指令重排序。

五、餓漢式

public class singleton

public static singleton getinstance()

}

介紹:這種方法非常簡單,因為單例的例項被宣告成 static 和 final 變數了,在第一次載入類到記憶體中時就會初始化,所以建立例項本身是執行緒安全的。缺點是它不是一種懶載入模式。比如 singleton 例項的建立是依賴引數或者配置檔案的,在 getinstance() 之前必須呼叫某個方法設定引數給它,那樣這種單例寫法就無法使用了。

五、靜態內部類

public class singleton   

private singleton (){}

public static final singleton getinstance()

}

介紹:

這種寫法仍然使用jvm本身機制保證了執行緒安全問題;由於 singletonholder 是私有的,除了 getinstance() 之外沒有辦法訪問它,因此它是懶漢式的;同時讀取例項的時候不會進行同步,沒有效能缺陷;也不依賴 jdk 版本。

六、列舉

public enum easysingleton 

}

介紹:我們可以通過easysingleton.instance來訪問例項,這比呼叫getinstance()方法簡單多了。建立列舉預設就是執行緒安全的,所以不需要擔心double checked locking,而且還能防止反序列化導致重新建立新的物件。

Java單例模式入門寫法

前言 樹上的鳥兒,你為何緊皺眉。地上的人兒,為乙個情字醉。西廂 原文出處 設計模式 23種設計模式,解決某一類問題最有效的方式 單例設計模式 解決的是乙個類在記憶體中只能有乙個物件的問題 1 構造方法私有化 2 構造方法私有化之後就乙個物件都不能建立了,那麼只能是自身提供自身型別的物件 3 提供乙個...

java單例模式的幾種寫法

private static final userservice userservice new userservice private userservice 採取預載入的方式,userservice在 classloader 載入userservice.class 已經宣告了物件 return ...

單例模式寫法

單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到餓漢式和懶漢式這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系...