小記Java單例模式的各種實現(xiàn)

單例模式是我們編程中最常用的設(shè)計模式,小記練習一下:

1、餓漢法:


public class Singleton {

private static final Singleton instance = new Singleton();

private Singleton(){}

public static Singleton getInstance(){

return instance;

}

}

這是最簡單的方法,在類引用的時候就會實例化。不能延遲加載,某種意義上會增加系統(tǒng)的負載。

2、懶漢法:


public class Singleton {

private static Singleton instance = null;

private Singleton(){}

public static Singleton getInstance(){

if(instance == null){

instance = new Singleton();

}

return instance;

}

}

在餓漢法的基礎(chǔ)上增加了延遲加載,只有調(diào)用getInstance的方法才會實例化對象,在單線程中沒有問題,但在多線程中有可能導致多次實例化。

3、多線程安全型:


public class Singleton {

private static volatile Singleton instance = null;

private Singleton(){}

public static Singleton getInstance(){

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

return instance;

}

}

在instance對象加上volatile關(guān)鍵字,保證其對所有的線程可見性,并禁止其對指令重排序優(yōu)化。在判斷null和new的部分進行加鎖。但是每次調(diào)用的時候,都要通過synchronize鎖機制排隊等待,會有效率方面的問題。

4、多線程安全性兼顧效率(雙重檢查鎖):


public class Singleton {

private static volatile Singleton instance = null;

private Singleton(){}

public static Singleton getInstance(){

if(instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

}

在synchronized關(guān)鍵字外層再加一個判斷null,只有為null后才會進入方法內(nèi),可以減少絕大部分的鎖操作。

==注意:volatile關(guān)鍵字在JDK 1.5之前無法完全保證指令優(yōu)化重排序,所以在JDK1.5之前雙重校驗是有問題的==

5、靜態(tài)內(nèi)部類


public class Singleton {

private Singleton(){}

private static class Holder{

private static Singleton instance = new Singleton();

}

public static Singleton getInstance(){

return Holder.instance;

}

}

將創(chuàng)建的過程放在靜態(tài)內(nèi)部類中,靜態(tài)內(nèi)部類只有被調(diào)用的時候才會加載,所以符合延遲加載。靜態(tài)內(nèi)部類只會被加載一次,所以是線程安全的。

以上所有方式,在序列化的時候都需要額外的工作(Serializable、transient、readResolve()),否則在反序列化的時候都會創(chuàng)建一個新的實例。

6、枚舉方式:


public enum Singleton {

INSTACE;

private String name;

public String getName() {

return name;

}

}

使用枚舉方式實現(xiàn)的單例模式,自帶線程安全和防止反射強行調(diào)用構(gòu)造器,還提供了自動序列化的機制,防止反序列化的時候創(chuàng)建新的對象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,901評論 11 349
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,900評論 18 399
  • 這是一個美好的時代,人民可以不用為了肚子發(fā)愁,同時也是一個競爭激烈的年代,年輕人壓力更大。因為選擇的多重性,越來越...
    wood4閱讀 237評論 0 1
  • 此刻坐在從福州回南京的高鐵上,回顧5天的訓練營的培訓生活,發(fā)生了很多事,也學到很多東西,每一次的感悟和收獲都可以拿...
    林下有清風閱讀 411評論 0 0
  • 早晨6點起床,趕快刷牙,然后把毛豆,紫薯,雞蛋,紅糖包一鍋蒸,準備了蘋果,雪梨,火龍果切塊,百香果蜂蜜果汁,6點4...
    向往精靈閱讀 387評論 0 0

友情鏈接更多精彩內(nèi)容