激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - JAVA教程 - 線程安全的單例模式的幾種實(shí)現(xiàn)方法分享

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

2019-11-07 12:43java教程網(wǎng) JAVA教程

線程安全的單例模式實(shí)現(xiàn)有幾種思路,個人認(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í)現(xiàn)了lazy),而且其加載過程是線程安全的。內(nèi)部類加載的時候?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;
   }
}

 

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

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;
   }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久伊人国产精品 | xxnxx中国18| 国产精品视频中文字幕 | 久久成人综合网 | 国产成年人小视频 | 国产精品一区在线免费观看 | 九九热这里只有精品8 | 亚洲av一级毛片特黄大片 | 欧美色另类 | 欧美性黄 | 国产在线1区 | 久久久久久久久久久久网站 | 久久福利国产 | 精品亚洲夜色av98在线观看 | 精品国产一区二区三区久久久蜜月 | 精品一区二区三区免费 | 中文字幕在线观看视频一区 | 羞羞视频免费观看入口 | 精品小视频 | 欧美一级黄色免费看 | 最新国产毛片 | 一级看片免费视频 | 久久国产夫妻视频 | 欧美精品一区二区三区四区 | 日本中文字幕电影在线观看 | 国内精品久久久久久影视8 嫩草影院在线观看网站成人 | 一本一道久久久a久久久精品91 | 日韩毛片在线看 | 欧美成人精品一区 | av在线在线 | 久久久久久久一区 | 毛片在哪里看 | 免费观看黄色一级视频 | 国产精品久久久久永久免费 | 久久精品视频免费观看 | 精品一区在线视频 | 久久线视频 | 在线中文字幕亚洲 | 日韩黄色片在线观看 | 欧美一级精品片在线看 | 久久99精品久久久久久秒播放器 |