2016-05-23 32 views
0

我們在學校的設計模式,並學到了單身的這樣的實現(懶/不是線程安全的一個):懶辛格爾頓什麼優勢了線程安全的一個

package com.crunchify.tutorials; 
public class CrunchifySingleton { 

    private static CrunchifySingleton instance = null; 

    protected CrunchifySingleton() { 
    } 

    // Lazy Initialization (If required then only) 
    public static CrunchifySingleton getInstance() { 
     if (instance == null) { 
      // Thread Safe. Might be costly operation in some case 
      synchronized (CrunchifySingleton.class) { 
       if (instance == null) { 
        instance = new CrunchifySingleton(); 
       } 
      } 
     } 
     return instance; 
    } 
} 

現在我找到了實現這樣的:

package com.crunchify.tutorials; 

public class ThreadSafeSingleton { 

    private static final Object instance = new Object(); 

    private ThreadSafeSingleton() { 
    } 

    // Runtime initialization 
    // By defualt ThreadSafe 
    public static Object getInstance() { 
     return instance; 
    } 
} 

現在我想知道,當第一實現使得使用更有意義,因爲根據http://crunchify.com/thread-safe-and-a-fast-singleton-implementation-in-java/第二個是線程安全的,需要較少的線路。

+1

是的,但第二個不懶。 – Kayaman

+0

@Kayaman單身人士懶惰而不是線程安全的優勢是什麼?這就是我沒有得到的。謝謝您的回答! – Gildraths

+1

單身人士真正需要的次數非常少,你實際需要一個懶惰初始化懶惰單例的次數再次更小。 –

回答

0

區別在於單例對象被實例化的時候。第二個片段在類實例化時僅實例化單例對象一次。如果沒有其他數據需要這個過程是有用的。請注意,如果發生實例化錯誤(在這種簡單的情況下無關緊要:只是Object),singleton類根本就不可用。

當被請求時,第一個片段實例化單例對象。您可以修改該類以提供一些機制來存儲任何初始化數據和/或捕獲實例化錯誤。

0

如何防止由於任何原因造成單例的多個實例。雙重檢查Singleton的鎖定是確保通過應用程序生命週期只創建一個Singleton類的實例的一種方法。顧名思義,在雙重檢查鎖定中,代碼檢查Singleton類的現有實例兩次,並且不加鎖以雙重確保不會創建超過一個單例實例。