研磨設計模式--單例模式-內部類

 * 上面的單例實現存在小小的缺陷,那麼 有沒有一種方法,既能夠實現延遲加載,又能夠
 * 實現線程安全呢?
       還真有高人想到這樣的解決方案了,這個解決方案被稱爲Lazy initialization
 * holder class 模式,這個模式綜合使用了java的類級內部類和多線程缺省同步鎖的知識,
 * 很巧妙的同時實現了延遲加載和線程安全。
 *
 *
 * 1 相應的基礎知識
  (1)什麼是類級內部類?
   簡單點說,類級內部類指的是,有static修飾的成員內部類。如果沒有static修飾的成員式內
   部類被稱爲對象級內部類。
   (2)類級內部類相當於其外部類的static成分,它的對象與外部類對象間不存在依賴關係,因此
   可以直接創建。而對象級內部類的實例,是綁定在外部對象實例中的。
   (3)類級內部類中,可以定義靜態的方法。在靜態方法中只能引用外部類中的靜態成員方法或變量。
   (4)類級內部類相當於其外部類的成員,只有在第一次被使用的時候纔會被裝載。
  
   多線程缺省同步鎖的知識:
   大家都知道,在多線程開發中,爲了解決併發問題,主要是通過使用synchronized來加互斥鎖進行同步控制,
   但是在某些情況下,JVM已經隱含的爲您執行了同步,這些情況下就不用自己再來進行同步控制了。
   這些情況包括:
   (1)由靜態初始化器(在靜態字段上或static{}塊中的初始化器)初始化數據時
   (2)訪問final字段時
   (3)在創建線程之前創建對象時
   (4)線程可以看見它將要處理的對象時
  
  
   2 解決方案的思路
        要想很簡單的實現線程安全,可以採用靜態初始化器的方式,它可以由JVM來保證線程的
   安全性。比如前面的餓漢式實現方式。但是這樣一來,不是會浪費一定的空間嗎?因爲這種
   實現方式,會在類裝載的時候就初始化對象,不管你需不需要。
        如果現在有一種方法能夠讓類裝載的時候不去初始化對象,那不就解決問題了?一種可行的
   方式就是採用類級內部類,在這個類級內部類裏面去創建對象實例。這樣一來,只要不使用到這個類級內部類,

   那就不會創建對象實例,從而同步實現延遲加載和線程安全。


public class Singleton_InnerClass {
        
 private static class SingletonHolder{
  //靜態初始化器,由JVM來保證線程安全
  private static Singleton_InnerClass instance=new Singleton_InnerClass();
 }
 
 //私有化構造方法
 private Singleton_InnerClass(){
  
 }
 
 public static Singleton_InnerClass getInstance(){
  return SingletonHolder.instance;
 }
}


發佈了315 篇原創文章 · 獲贊 14 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章