一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 線程安全的單例模式的幾種實現方法分享

線程安全的單例模式的幾種實現方法分享

2019-11-07 12:43java教程網 JAVA教程

線程安全的單例模式實現有幾種思路,個人認為第2種方案最優雅:、餓漢式、借助內部類、普通加鎖解決、雙重檢測,但要注意寫法,如果單體模式繼續擴展為N元單體模式,那就是對象池模式了

1、餓漢式單例

 

復制代碼代碼如下:


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

 

   private Singleton() { }

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

 

2、借助內部類
屬于懶漢式單例,因為Java機制規定,內部類SingletonHolder只有在getInstance()方法第一次調用的時候才會被加載(實現了lazy),而且其加載過程是線程安全的。內部類加載的時候實例化一次instance。

 

復制代碼代碼如下:


public class Singleton {

   private Singleton() { }

 

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

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

 

3、普通加鎖解決

 

復制代碼代碼如下:


public class Singleton {
   private static Singleton instance = null;

 

   private Singleton() { }

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

      return instance;
   }
}

 

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

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

 

復制代碼代碼如下:


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實例變量用volatile修飾就可以了,volatile修飾的話就可以確保instance = new Singleton();對應的指令不會重排序,如下的單例代碼也是線程安全的:
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;
   }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲伦理一区 | 色戒完整版2小时38分钟 | 91久色 | 亚洲xxxxxhd奶水女人 | www国产精品 | 亚洲白拍 | 国产高清免费午夜在线视频 | 天堂伊人| 免费一级特黄特色大片在线观看 | 亚洲欧美在线观看一区二区 | 日韩视频免费观看 | 精品国产精品国产偷麻豆 | 香蕉大久久 | 久久性综合亚洲精品电影网 | 成年视频在线观看免费 | 黑人性xxxⅹxxbbbbb| 免费看h片的网站 | 青青国产在线视频 | 免费看h片的网站 | 脱女学小内内摸出水网站免费 | 国产欧美日韩一区二区三区在线 | 国产成人小视频 | www.色姐姐| 欧美日韩国产精品综合 | 岛国a香蕉片不卡在线观看 荡女淫春2古装 | 日韩久久综合 | 色悠久久久久综合网小说 | 国产精品视频第一区二区三区 | 亚洲高清视频在线 | 四虎网站在线 | 好大好硬快点好爽公 | 精品卡1卡2卡三卡免费视频 | 调教女警花穿环上班 | 日本暖暖视频在线观看 | 极品丝袜老师h系列全文阅读 | a级亚洲片精品久久久久久久 | 免费国产高清视频 | 变态 另类 人妖小说 | 91动漫在线观看 | 日b在线观看 | chinses台湾男同志hd |