我一直得到混合的答案,关于这段代码是否线程安全。我正在使用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()
的结果。
volatile
引用,您的代码是线程安全的。 - Keppilsupplier.get()
永远不会返回null
。 - Andy BrowngetOrCompute()
时被调用。 - biziclop