最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

線程安全的單例模式的幾種實(shí)現(xiàn)方法分享

 更新時(shí)間:2014年02月18日 09:37:24   作者:  
線程安全的單例模式實(shí)現(xiàn)有幾種思路,個(gè)人認(rèn)為第2種方案最優(yōu)雅:、餓漢式、借助內(nèi)部類、普通加鎖解決、雙重檢測,但要注意寫法,如果單體模式繼續(xù)擴(kuò)展為N元單體模式,那就是對象池模式了

1、餓漢式單例

復(fù)制代碼 代碼如下:

public class Singleton {
   private final static Singleton INSTANCE = new Singleton();

   private Singleton() { }

   public static Singleton getInstance() {
      return INSTANCE;
   }
}

2、借助內(nèi)部類
屬于懶漢式單例,因?yàn)镴ava機(jī)制規(guī)定,內(nèi)部類SingletonHolder只有在getInstance()方法第一次調(diào)用的時(shí)候才會被加載(實(shí)現(xiàn)了lazy),而且其加載過程是線程安全的。內(nèi)部類加載的時(shí)候?qū)嵗淮蝘nstance。

復(fù)制代碼 代碼如下:

public class Singleton {

   private Singleton() { }

   private static class SingletonHolder {
      private final static Singleton INSTANCE = new Singleton();
   }

   public static Singleton getInstance() {
      return SingletonHolder.INSTANCE;
   }
}

3、普通加鎖解決

復(fù)制代碼 代碼如下:

public class Singleton {
   private static Singleton instance = null;

   private Singleton() { }

   public static synchronized Singleton getInstance() {
      if(instance == null) {
         instance = new Singleton();
      }

      return instance;
   }
}

雖然解決了線程安全問題,但是每個(gè)線程調(diào)用getInstance都要加鎖,我們想要只在第一次調(diào)用getInstance時(shí)加鎖,請看下面的雙重檢測方案

4、雙重檢測,但要注意寫法

復(fù)制代碼 代碼如下:

public class Singleton {
   private static Singleton instance = null;

   private Singleton() { }

   public static Singleton getInstance() {
      if(instance == null) {
         synchronzied(Singleton.class) {
            Singleton temp = instance;
            if(temp == null) {
               temp = new Singleton();
               instance = temp
            }
         }
      }

      return instance;
   }
}

由于指令重排序問題,所以不可以直接寫成下面這樣:
public class Singleton {
   private static Singleton instance = null;

   private Singleton() { }

   public static Singleton getInstance() {
      if(instance == null) {
         synchronzied(Singleton.class) {
            if(instance == null) {
               instance = new Singleton();
            }
         }
      }

      return instance;
   }
}

但是如果instance實(shí)例變量用volatile修飾就可以了,volatile修飾的話就可以確保instance = new Singleton();對應(yīng)的指令不會重排序,如下的單例代碼也是線程安全的:
public class Singleton {
   private static volatile Singleton instance = null;

   private Singleton() { }

   public static Singleton getInstance() {
      if(instance == null) {
         synchronzied(Singleton.class) {
            if(instance == null) {
               instance = new Singleton();
            }
         }
      }

      return instance;
   }
}

相關(guān)文章

  • 如何優(yōu)雅的替換掉Java代碼中的if else

    如何優(yōu)雅的替換掉Java代碼中的if else

    這篇文章主要介紹了如何優(yōu)雅的替換掉Java代碼中的if else,幫助大家優(yōu)化自己的Java代碼,提高可讀性與簡潔性,感興趣的朋友可以了解下
    2020-09-09
  • Spring Security LDAP實(shí)現(xiàn)身份驗(yàn)證的項(xiàng)目實(shí)踐

    Spring Security LDAP實(shí)現(xiàn)身份驗(yàn)證的項(xiàng)目實(shí)踐

    在本文中,我們涵蓋了“使用 Spring Boot 的 Spring Security LDAP 身份驗(yàn)證示例”的所有理論和示例部分,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • mybatis的test坑及解決(不等于‘‘ 且 不等于0)

    mybatis的test坑及解決(不等于‘‘ 且 不等于0)

    這篇文章主要介紹了mybatis的test坑及解決(不等于‘‘ 且 不等于0),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot+Dubbo+Zookeeper知識整合過程詳解

    SpringBoot+Dubbo+Zookeeper知識整合過程詳解

    本文首先介紹了分布式系統(tǒng)的基本概念和分類,包括單一應(yīng)用架構(gòu)、垂直應(yīng)用架構(gòu)、分布式服務(wù)架構(gòu)和流動計(jì)算架構(gòu),通過一個(gè)完整的Spring Boot + Dubbo + Zookeeper框架搭建示例,展示了如何將這些技術(shù)整合到一個(gè)實(shí)際的項(xiàng)目中,感興趣的朋友一起看看吧
    2025-02-02
  • java設(shè)計(jì)模式之抽像工廠詳解

    java設(shè)計(jì)模式之抽像工廠詳解

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之抽像工廠的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java并發(fā)編程面試之線程池

    Java并發(fā)編程面試之線程池

    線程池和并發(fā)問題是Java技術(shù)面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java調(diào)用ffmpeg實(shí)現(xiàn)視頻轉(zhuǎn)換的方法

    java調(diào)用ffmpeg實(shí)現(xiàn)視頻轉(zhuǎn)換的方法

    這篇文章主要介紹了java調(diào)用ffmpeg實(shí)現(xiàn)視頻轉(zhuǎn)換的方法,較為詳細(xì)分析了java視頻格式轉(zhuǎn)換所需要的步驟及具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • Eclipse中導(dǎo)出碼云上的項(xiàng)目方法(圖文教程)

    Eclipse中導(dǎo)出碼云上的項(xiàng)目方法(圖文教程)

    下面小編就為大家?guī)硪黄狤clipse中導(dǎo)出碼云上的項(xiàng)目方法(圖文教程)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java使用Unsafe類的示例詳解

    Java使用Unsafe類的示例詳解

    java不能直接訪問操作系統(tǒng)底層,而是通過本地方法來訪問。Unsafe類提供了硬件級別的原子操作,這篇文章主要介紹了Java使用Unsafe類,需要的朋友可以參考下
    2021-09-09
  • 詳談Java中BigDecimal的一個(gè)除法異常

    詳談Java中BigDecimal的一個(gè)除法異常

    下面小編就為大家分享一篇詳談Java中BigDecimal的一個(gè)除法異常,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11

最新評論

阳泉市| 基隆市| 大名县| 大姚县| 扎赉特旗| 那坡县| 图片| 洛阳市| 钟祥市| 丹巴县| 宁明县| 平乐县| 闽清县| 古交市| 旅游| 从江县| 禹城市| 灌云县| 乌什县| 威远县| 桦南县| 泾源县| 永康市| 攀枝花市| 金门县| 手机| 中山市| 甘洛县| 星座| 葫芦岛市| 喀喇沁旗| 通辽市| 乾安县| 英山县| 镇平县| 恩施市| 如皋市| 和林格尔县| 丹棱县| 南华县| 通江县|