單例模式-靜態內部類方式


前言:
上節中,我們分析了要解決線程重排序的問題,找了兩種解決方案,第一種方案上節已經實現,那么我們這節就來實現第二種解決方案。
1、不允許2、3進行重排序,加入了volatile關鍵字.
2、允許一個線程進行重排序,但不允許另外線程看到他的重排序。
大家有沒有想到用靜態內部類解決呢?那么我們先了解一下它吧!
1、內部靜態類解決原理:如下圖1

 

 圖一
* jvm在類的初始化階段,也就是class被加載后,也就是被線程使用之前,都是類的初始化階段,在這個階段會執行類的初始化。
* 在執行類的初始化期間呢,jvm會獲取一個鎖,這個鎖可以同步多個線程對一個類的初始化,也就是綠色的部分,基於這個特性,
* 我們可以實現基於靜態內部類的、並且是線程安全的延遲初始化方案。
現在我們知道了靜態內部類可以不允許另外線程看到他的重排序,是利用了靜態內部類具有線程安全的延遲方案的特性。
2、線程安全的延遲方案的特性的擴展
根據java的語言規范,假設有一個類,為A,則一個有五種方案都可以有
線程安全的延遲方案的特性。
A類會立刻被初始化的5種情況
* 1、A類型的實例被創建。
* 2、A類中聲名的一個靜態方法被調用。
* 3、A類中聲名的一個靜態成員被賦值。
* 4、A類中聲名的一個靜態成員被使用,並且靜態成員不是一個常量成員。
* 5、A類如果是一個頂級類,在類中嵌套的有斷言語句,這種情況A類也會被立刻初始化。
* 滿足以上某一條件,就會立刻初始化。
3、不允許另外線程看到他的重排序的代碼
public class StaticInnerClassSingleton {

    private static class InnerClass {
        private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
    }
    public static StaticInnerClassSingleton getInstance(){
        return InnerClass.staticInnerClassSingleton;
    }
}

結束!

 
 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM