public class Singleton{安全
/**spa
類級的內部類,也就是靜態的成員式內部類,該內部類的實例與外部類的實例線程
沒有綁定關係,並且只有被調用到纔會加載,從而實現了延遲加載get
*/同步
private static class SingletonHolder{虛擬機
/**class
靜態化初始器,由JVM來保證線程安全方法
*/
線程安全
private static Singleton instance = new Singleton();static
}
/**
私有化構造方法
*/
private Singleton{}
public static Singleton getInstance(){
return SingletonHolder.instance();
}
}
這樣,當getInstance方法第一次被調用時,它第一次讀取SingletonHolder.instance,致使SingletonHolder類獲得初始化;而這個類在加載並初始化的時候,會初始化它的靜態域,從而建立Singleton實例,因爲是靜態的域,所以只會被虛擬機在裝載類的時候初始化一次,並由虛擬機來保證它的線性安全。
這個模式的優點在於,getInstance方法並無被同步,而且只是執行一個域的訪問,所以延遲初始化並無增長任何訪問開銷。