Проблема в том, что теоретически у вас нет контроля над тем, что вернет поставщик .get (). Это может быть null, это может быть каждый раз другое значение и т. Д. c. По этой причине я утверждаю, что этот код не является потокобезопасным. Также обратите внимание, что «поставщик» будет иметь значение NULL только в том случае, если они это сделают:
new Lazy(null)
в противном случае он никогда не будет равен NULL. В этом случае вы также можете создать исключение в конструкторе
public Lazy(Supplier<T> supplier) {
if (supplier == null) {
throw new IllegalArgumentException("'supplier' must not be null");
}
this.supplier = supplier;
}
Я не уверен, чего вы здесь пытаетесь достичь. Если вы хотите лениво инициализировать "значение" только один раз, вы можете сделать что-то вроде:
if (value == null) {
synchronize (this) {
// test again to ensure no other thread initialized as we acquired monitor
if (value == null) {
value = supplier.get();
}
}
}
return value;