class MyClass
{
private static volatile Resource resource;
public static Resource getInstance()
{
if(resource == null)
resource = new Resource();
return resource;
}
}
Здесь мое сомнение связано с java concurrency на практике, если вы используете летучую, безопасную публикацию (например, как только ссылка видна другому потоку, данные также доступны). Могу ли я использовать его здесь? Но если это правильно, то предположим, что thread1 теперь проверяет "ресурс", и он null, поэтому он начинает создавать объект. В то время как thread1 создает объект objet другой, т.е. thread2 приходит и начинает проверять значение "resource", а thread2 считает его нулевым (предполагая, что для создания ресурса "ресурс" требуется некоторое значительное количество времени, и поскольку thread1 еще не завершил создание, безопасная публикация не была, следовательно, недоступна для thread2), тогда он также начнет создавать объект? если да, то инвариант класса ломается. Я прав? Пожалуйста, помогите мне в понимании этого особого использования волатильности здесь.