【发布时间】:2014-08-15 17:05:24
【问题描述】:
这个问题实际上是指different question,因为它可能没有很好地表述,所以被关闭为重复。
对于此代码示例(在多线程环境中),什么是有效的替代惰性初始化习惯用法而不是双重检查锁定:
public class LazyEvaluator {
private final Object state;
private volatile LazyValue lazyValue;
public LazyEvaluator(Object state) {
this.state = state;
}
public LazyValue getLazyValue() {
if (lazyValue == null) {
synchronized (this) {
if (lazyValue == null) {
lazyValue = new LazyValue(someSlowOperationWith(state), 42);
}
}
}
return lazyValue;
}
public static class LazyValue {
private String name;
private int value;
private LazyValue(String name, int value) {
this.name = name;
this.value = value;
}
private String getName() {
return name;
}
private int getValue() {
return value;
}
}
}
编辑已更新以包含缓慢的操作并添加了关于多线程环境的明确提及
【问题讨论】:
-
您认为这“无效”的原因是什么?
-
是的。问题是关于替代的,因为 DCL 通常被认为是反模式(参见参考问题)
标签: java concurrency double-checked-locking