Я продолжаю получать смешанные ответы относительно того, является ли этот код потокобезопасным или нет. Я работаю в Java 8.Является ли эта эталонная нить безопасной?
private final Object lock = new Object();
private volatile Object reference = null;
public Object getOrCompute(Supplier<Object> supplier) {
if (reference == null) {
synchronised(lock) {
if (reference == null) {
reference = supplier.get();
}
}
}
return reference;
}
Мои ожидания в том, что данный новый экземпляр этого класса, множественные вызовы getOrCompute()
будет только когда в результате одного поставщика будет вызван, и результатом этого поставщика является результатом всех звонки (и будущие звонки) до getOrCompute()
.
Согласно [этой статье] (http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html) некоторыми довольно тяжелыми именами Java ваш код является потокобезопасным благодаря 'volatile' Справка. – Keppil
Я надеюсь, что 'поставщик.get()' никогда не сможет вернуть 'null'. –
@AndyBrown В чем проблема, если он возвращает null –