<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    中文JAVA技術平等自由協作創造

    Java專題文章博客和開源

    常用鏈接

    統計

    最新評論

    JAVA中單例模式的幾種實現方式

      1 線程不安全的實現方法

      首先介紹java中最基本的單例模式實現方式,我們可以在一些初級的java書中看到。這種實現方法不是線程安全的,所以在項目實踐中如果涉及到線程安全就不會使用這種方式。但是如果不需要保證線程安全,則這種方式還是不錯的,因為所需要的開銷比較小。下面是具體的實現代碼:

      public Class Singleton

      {

      private static Singleton instance = null;

      private Singleton(){}

      public static Singleton getInstance()

      {

      if( instance == null)

      instance = new Singleton ();

      return instance;

      }

      }

      我們說過這種實現方式不是thread-safe的,那么可以把上面的方法變成線程安全的嗎?當然可以,在方法getInstance()上加上synchronized修飾符就可以實現方法的同步了。但是這樣系統開銷會很大。具體代碼如下:

      public Class Singleton

      {

      private static Singleton instance = null;

      private Singleton(){}

      public static synchronized Singleton getInstance()

      {

      if( instance == null)

      instance = new Singleton ();

      return instance;

      }

      }

      每次有線程調用getInstance()方法,都需要同步判斷。這顯然不是最好的選擇,下面將會陸續介紹幾種thread-safe的方法。

      2 兩種lazy loaded thread-safe的單例模式實現方式

      1) DCL (double checked locking 實現法)

      double checked locking ,顧名思義,就是雙檢查法,檢查實例INSTANCE是否為null或者已經實例化了。下面是具體的實現代碼:

      1 public class DoubleCheckedLockingSingleton{

      2 private volatile DoubleCheckedLockingSingleton INSTANCE;

      3

      4 private DoubleCheckedLockingSingleton(){}

      5

      6 public DoubleCheckedLockingSingleton getInstance(){

      7 if(INSTANCE == null){

      8 synchronized(DoubleCheckedLockingSingleton.class){

      9 //double checking Singleton instance

      10 if(INSTANCE == null){

      11 INSTANCE = new DoubleCheckedLockingSingleton();

      12 }

      13 }

      14 }

      15 return INSTANCE;

      16 }

      17 }

      這種方法也很好理解,我們可以看到有兩次對instance是否為null的判斷:如果第一次判斷不為空,則直接返回實例就可以了;如果instance為空,則進入同步代碼塊再進行null值判斷,再選擇是否實例化。第一個null判斷可以減少系統的開銷。在實際項目中做過多線程開發的都應該知道DCL.

      2) lazy initialization holder class 模式實現法

      下面是這種方法的實現代碼:

      public class Singleton {

      /**

      * 類級的內部類,也就是靜態的成員式內部類,該內部類的實例與外部類的實例

      * 沒有綁定關系,而且只有被調用到才會裝載,從而實現了延遲加載

      */

      private static class SingletonHolder{

      /**

      * 靜態初始化器,由JVM來保證線程安全

      */

      private static Singleton instance = new Singleton();

      }

      /**

      * 私有化構造方法

      */

      private Singleton(){

      }

      public static Singleton getInstance(){

      return SingletonHolder.instance;

      }

      }

      當getInstance方法第一次被調用的時候,它第一次讀取SingletonHolder.instance,導致SingletonHolder類得到初始化;而這個類在裝載并被初始化的時候,會初始化它的靜態域,從而創建Singleton的實例,由于是靜態的域,因此只會被虛擬機在裝載類的時候初始化一次,并由虛擬機來保證它的線程安全性。這個模式的優勢在于,getInstance方法并沒有被同步,并且只是執行一個域的訪問,因此延遲初始化并沒有增加任何訪問成本。

      關于延遲初始化(lazy loaded)

      "除非絕對必要,否則就不要延遲初始化".延遲初始化是一把雙刃劍,它降低了初始化類或者創建實例的開銷,卻增加了訪問被延遲初始化的域的開銷,考慮到延遲初始化的域最終需要初始化的開銷以及域的訪問開銷,延遲初始化實際上降低了性能雅思答案 tygj123.com

      3 靜態工廠實現法

      因為單例是靜態的final變量,當類第一次加載到內存中的時候就初始化了,其thread-safe性由JVM來負責保證。值得注意的是這個實現方式不是lazy-loadedd的。 具體實現代碼如下:

      1 public class Singleton{

      2 //initailzed during class loading

      3 private static final Singleton INSTANCE = new Singleton();

      4

      5 private Singleton(){}

      6

      7 public static Singleton getSingleton(){

      8 return INSTANCE;

      9 }

      10 }

      4 枚舉實現單例(Enum Singleton)

      枚舉單例(Enum Singleton)是實現單例模式的一種新方式,枚舉這個特性是在Java5才出現的,在《Effective Java》一書中有介紹這個特性。下面是這種方法的具體實現代碼:

      public enum Singleton {

      INSTANCE("hello") {

      public void someMethod() {

      // . . .

      }

      };

      private String name;

      private void PrintName(){System.out.println(name);}

      protected abstract void someMethod();

      }

      你可以通過Singleton.INSTANCE來訪問該單示例變量。默認枚舉實例的創建是線程安全的,但是在枚舉中的其他任何方法由程序員自己負責。如果你正在使用實例方法,那么你需要確保線程安全(如果它影響到其他對象的狀態的話)。傳統單例存在的另外一個問題是一旦你實現了序列化接口,那么它們不再保持單例了,但是枚舉單例,JVM對序列化有保證。枚舉實現單例的好處:有序列化和線程安全的保證,代碼簡單。 www.yz-lc.com
     

    posted on 2014-03-06 14:20 好不容易 閱讀(169) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    PK10開獎 PK10開獎
    主站蜘蛛池模板: 一本久久a久久精品亚洲| 破了亲妺妺的处免费视频国产| 国产精品美女自在线观看免费| 亚洲av永久无码嘿嘿嘿| 999久久久免费精品国产 | 成人免费无码精品国产电影| 亚洲AV综合色区无码二区爱AV| 我们的2018在线观看免费高清| 亚洲卡一卡2卡三卡4麻豆| 国产又黄又爽又猛免费app| 国产成+人+综合+亚洲专| 久久久久国产精品免费免费搜索| 亚洲国产成人久久| 天天操夜夜操免费视频| 国内成人精品亚洲日本语音| 国产又粗又长又硬免费视频| 成人午夜免费视频| 亚洲老妈激情一区二区三区| 久久大香伊焦在人线免费| 2022年亚洲午夜一区二区福利| 国色精品卡一卡2卡3卡4卡免费| 亚洲熟妇久久精品| 四虎在线播放免费永久视频| 久久久久久久国产免费看| 亚洲AV日韩AV永久无码绿巨人 | 久久九九兔免费精品6| 亚洲人成电影网站| 国产高清在线免费视频| 国产99久久久久久免费看| 亚洲Av熟妇高潮30p| 午夜免费不卡毛片完整版| 国产男女爽爽爽免费视频| 亚洲黄色在线电影| 色播在线永久免费视频| 久青草国产免费观看| 亚洲国产人成网站在线电影动漫 | 免费又黄又硬又爽大片| a国产成人免费视频| 亚洲午夜久久久久久尤物| 亚洲成AV人在线观看网址| 99精品视频在线视频免费观看 |