Guava Suppliers类包含MemoizingSupplier:
static class MemoizingSupplier<T> implements Supplier<T>, Serializable {
final Supplier<T> delegate;
transient volatile boolean initialized;
// "value" does not need to be volatile; visibility piggy-backs
// on volatile read of "initialized".
transient T value;
MemoizingSupplier(Supplier<T> delegate) {
this.delegate = delegate;
}
@Override public T get() {
// A 2-field variant of Double Checked Locking.
if (!initialized) {
synchronized (this) {
if (!initialized) {
T t = delegate.get();
value = t;
initialized = true;
return t;
}
}
}
return value;
}
@Override public String toString() {
return "Suppliers.memoize(" + delegate + ")";
}
private static final long serialVersionUID = 0;
}
有人可以解释一下这条评论的意思吗?
“value”字段不需要是volatile的;“initialized”字段的volatile读取可以实现可见性。
“initialized”字段上的volatile如何影响“value”字段呢? 根据此文,我们可能会得到“initialized”和“value”字段的不一致组合(例如true+null)。我错了吗?