2012-02-17 126 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