【发布时间】:2020-07-09 02:55:19
【问题描述】:
示例代码如下
public class Lazy<T> implements Supplier<T> {
public Lazy(Supplier<T> supplier) {
this.supplier = Objects.requireNonNull(supplier);
}
Supplier<T> supplier;
T value;
@Override
public T get() {
if (supplier != null) {
synchronized (this) {
if (supplier != null) {
value = supplier.get();
supplier = null;
}
}
}
return value;
}
}
我担心如果“供应商”是一个构造函数。 “supplier=null”可以在对象初始化之前执行。可能会出现类似于“双重检查锁定损坏”的错误。
"supplier.get()==null" 在这个类中可能为真。所以我不检查值是否为空
如果它是线程不安全的,我应该在“供应商”字段之前添加“volatile”吗? 如果它是线程安全的,为什么?
【问题讨论】:
-
使用其他变量而不是设置supplier=null不是更好吗?
-
get是一个实例方法,因此调用它的唯一方法是通过Lazy的实例,因此您需要调用@987654324 的构造函数@,因此为什么不制作Supplierfinal并摆脱if (supplier != null) {检查?为什么要同步get的结果 而不是supplier本身?否则T必须是易失性的,是的。 -
谢谢你的提醒。我写了错误的示例代码。我已经更正了内容
标签: java thread-safety