* 實現線程安全呢?
* 還真有高人想到這樣的解決方案了,這個解決方案被稱爲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;
}
}