執行緒安全 Singleton 雙重檢查鎖定

這種型別的 Singleton 是執行緒安全的,並且在建立 Singleton 例項後防止不必要的鎖定。

Version >= Java SE 5

public class MySingleton {

    // instance of class
    private static volatile MySingleton instance = null;

    // Private constructor
    private MySingleton() {
        // Some code for constructing object
    }

    public static MySingleton getInstance() {
        MySingleton result = instance;
        
        //If the instance already exists, no locking is necessary
        if(result == null) {
            //The singleton instance doesn't exist, lock and check again
            synchronized(MySingleton.class) {
                result = instance;
                if(result == null) {
                    instance = result = new MySingleton();
                }
            }
        }
        return result;
    }
}

必須強調的是 - 在 Java SE 5 之前的版本中,上面的實現是不正確的 ,應該避免。在 Java 5 之前,無法在 Java 中正確實現雙重檢查鎖定。