1. 程式人生 > >靜態內部類實現的單例模式是如何保證執行緒安全的

靜態內部類實現的單例模式是如何保證執行緒安全的

靜態內部類實現的單例模式如下:

public class Singleton {
    private Singleton(){
        
    }
    
    public static Singleton getInstance(){
        return SingletonHolder.sInstance;
    }
    
    private static class SingletonHolder{
        private static final Singleton sInstance = new Singleton();
    }

}

//當第一次載入Singleton類時並不會初始化sInstance,只有在第一次呼叫Singleton的getInstance方法時才會導致sInstance被初始化。
//因此第一次呼叫getInstance方法會導致虛擬機器載入SingletonHolder類,
//這種方式不僅能夠確保執行緒安全,也能保證單例物件的唯一性,同時延遲了單例的例項化。

//這種方式不僅能夠確保執行緒安全

//原因:虛擬機器會保證一個類的構造器<clinit>()方法在多執行緒環境中被正確地載入,同步,如果多個執行緒同時去初始化一個類,那麼只有一個執行緒去執行這個類的
//構造器<clinit>()方法,其他執行緒都需要阻塞等待,直到活動執行緒執行<clinit>()方法完畢。