作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
关于这段代码是否是线程安全的,我总是得到不同的答案。我正在使用 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()
只会导致调用一个供应商,并且该供应商的结果是所有调用的结果(和 future 的调用)到 getOrCompute()
。
最佳答案
这是安全的,因为在 supplier.get()
中所做的任何事情都不能通过分配给 reference
来重新排序。 (或者更准确地说,当您对 reference
进行 volatile 读取时,它不能显示为重新排序。)
锁提供排他性,可变的写/读语义提供可见性。请注意,自很久以前发布的 Java 5 以来,这一直是正确的,但您仍然会在 Internet 上找到关于双重检查锁定(因为这是这个习语的正式名称)如何过时的文章。工作。它们在当时是正确的,但现在已经过时了。
如果供应商本身提供可变对象,则可能不安全。但那是另一回事。
关于java - 设置这个引用线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31244967/
我是一名优秀的程序员,十分优秀!