Я хочу знать, что такое использование переменной Instance как изменчивой в двойной нулевой проверке реализации Singleton. Потому что в соответствии с моим пониманием синхронизация блока обеспечивается до неявного. Ни один из двух потоков не может получить доступ к этому синхронизированному блоку одновременно, а при выходе из синхронизированного блока поток записывает все свои локальные кэшированные данные в основную память. Я много искал, но все же у меня есть сомнения в этой реализации. Пожалуйста, объясните правильное использование.Использование volatile в singleton double null check реализация в java
private volatile Singleton INSTANCE;
public Singleton get() {
if (INSTANCE == null) {
synchronized (this) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
В вышеуказанном двойном контрольном коде. Что может быть проблемой, если я не сделаю свой экземпляр нестабильным. Потому что, когда первый поток входит в блок синхронизации, ни один другой поток не получит доступ к этому блоку. И когда первая нить покидает этот блок. Объект будет создан и должен произойти до свойства, последнее значение экземпляра будет записано в основной памяти. Итак, почему волатильность важна в этом сценарии?
Здесь есть ссылка (Is there any need to add volatile keyword to guarantee thread-safe singleton class in java?). Но ответы не очень ясны. Я не думаю, что в данном сценарии выше любой вид оптимизации JVM может привести к разрыву происходит перед из Синхронизировать блок
Покажите нам код, о котором вы говорите, и покажите нам, что именно происходит - прежде чем вы говорите. Тогда мы можем это объяснить. –
(Это, вероятно, дубликат, но без каких-либо подробностей будет сложно выбрать лучшего дубликата.) –
Пожалуйста, внесите это в вопрос. –