2013-07-23 2 views
1

Как говорится в заголовке, почему статический вложенный класс singleton thread safe?Почему статический внутренний класс singleton thread safe

public class Singleton  
{  
    private static class SingletonHolder  
    {  
     public static Singleton instance = null; 
     public static Singleton getInstance(){ 
      if (null == instance) { 
       instance = new Singleton(); 
      } 
     }  
    }  

    public static Singleton getInstance()  
    {  
     return SingletonHolder.getInstance();  
    }  
} 
+3

Во-первых, ваш код не может быть скомпилирован. – OQJF

ответ

15

Код, который вы видите, не является технически потокобезопасным. Этот вид хитроумного кода часто получает завитушки.

Код должен выглядеть следующим образом:

public class Singleton {  
    private static class SingletonHolder {  
     public static final Singleton instance = new Singleton(); 
    }  

    public static Singleton getInstance() {  
     return SingletonHolder.instance;  
    }  
} 

Здесь мы присваиваем в статическом Инициализатором (из SingletonHolder), который будет виден любым потоком доступа к нему с правильной происходит, прежде, чем отношения. Вложенного класса нет ничего особенного, он просто позволяет использовать внешний класс без непосредственной сборки объекта singleton. Почти наверняка это совершенно бессмысленно, но, похоже, кому-то нравятся.

Как всегда [изменчивые] синглтоны - действительно плохая идея.

+0

Ваш код не компилируется. У SingletonHolder нет метода getInstance() ' – Gus

+0

, в чем смысл неизменяемого синглтона? – ZhongYu

+0

@ zhong.j.yu Ну, это не будет Singleton по любому разумному определению. Реализации отдельных экземпляров полезны для функторов (таких как 'Компаратор') и выделенного значения. –

2

Это поточно-безопасный, поскольку JVM обрабатывает ленивую загрузку вложенного класса.

Однако код, который вы отправили, кажется, не использует этот шаблон правильно (вы не должны иметь нулевую проверку), и я думаю, что это фактически нарушает безопасность потока. Вот хорошая статья, где вы можете прочитать больше о том, почему эта схема работает и как правильно его использовать:

Initialization-on-demand holder idiom

+2

Код op определенно небезопасен ... – assylias

+0

OP ninja-редактировал вопрос. Оригинал был таким же, как в ответе Тома Хотина – Affe