2017-02-17 15 views
0

Инициализировать экземпляр singleton с помощью статической техники, , чтобы предотвратить синхронизацию? как это работает?инициализировать экземпляр singleton с помощью статической техники, чтобы предотвратить синхронизацию? как это работает?

Я видел некоторые, где без использования блока синхронизации мы можем создать потоковый одноэлементный экземпляр?

Как это работает? Как они оба одинаковы?

+2

Пожалуйста, добавьте больше деталей. На каком языке вы ссылаетесь? Предоставление фактического образца кода может помочь другим лучше понять проблему. – ALoopingIcon

+0

Извините, и я использую java. –

ответ

0

Предполагая, что вы имеете в виду реализации, такие как:

class Singleton { 

    private static Singleton instance = new Singleton(); 

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

линия: private static Singleton instance = new Singleton(); оценивается во время загрузки класса (что означает, что если злоумышленник загружает этот несколько раз класса - несколько экземпляров будет создан!).

Класс (обычно) загружается только один раз, прежде чем он будет использоваться (либо путем вызова статического поля/метода, либо путем создания экземпляра). Этот механизм синхронизируется JVM:

Реализация виртуальной машины Java отвечает за заботясь о синхронизации и рекурсивной инициализации с помощью следующую процедуру ...

Источник: http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4.2

+0

Спасибо, и это помогло –