2012-02-17 188 views
1

我現在有一個程序執行Singleton設計模式:線程安全的方法

public class Singleton { 
    private static Singleton s; 

    private Singleton(){ 

    } 

    public static Singleton getInstance(){ 
     if(s == null){ 
      s = new Singleton(); 
     } 

     return s; 
    } 
} 

有人問我,在給定這樣的節目,有什麼好的選擇,使getInstance方法線程安全的採訪。我知道一種方法只是在方法之前標記同步,但面試官說還有其他更有效的方法來處理線程安全的方法。

任何人都可以提供任何想法?

+4

檢查http://en.wikipedia.org/wiki/Singleton_pattern並檢查比爾Pugh的代碼(不使用枚舉這是最好的) – asela38 2012-02-17 01:55:46

+0

這是所有解釋[這個優秀的答案](http://stackoverflow.com /問題/ 9239832 /需求信息 - 上 - 單級式的Java/9239856#9239856),以同步的非常類似的問題 – Bohemian 2012-02-17 03:13:18

回答

1

至少有三個,我能想到的,但其中的兩個歸結到同一個原則。

基本上你可以讓有關線程安全類加載器的擔憂或起使用雙重檢查鎖定從Java5中。

第一版本是指具有一個內部類/枚舉包含實際代碼,第二個先進行Singleton實例易失性和使用通常的IF-同步-如果溶液。

1

哦,我的話,不是這個。

寫這個的最佳方式是最簡單的:

public class Singleton { 
    private static Singleton s = new Singleton(); 
    // ... 
} 

製作同步的吸氣劑是第二個最好的。還有一些更復雜的方式來做到這一點,但他們都不是值得的 -​​是便宜,不要讓任何人告訴你,否則。

+0

*能*是正確的情況下便宜,但如果鎖爭用它可以得到相當昂貴。 – Voo 2012-02-17 01:56:40

+0

如果鎖正在保護單例的實例化,那麼實際的爭用可能只發生在一個瞬間 - 當實際實例化發生時。之後,這一切都是肉汁。 – 2012-02-17 01:59:08

+2

但是在你的解決方案(「同步方法」)中,每次調用方法時都要進行同步,同樣在實例化之後。這意味着如果鎖被爭奪,我們會得到一個沉重的鎖和一些相當昂貴的鎖。 – Voo 2012-02-17 02:09:54