一種更好的方式解決單例模式延遲加載和線程安全的問題

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方法並無被同步,而且只是執行一個域的訪問,所以延遲初始化並無增長任何訪問開銷。

相關文章
相關標籤/搜索