gpt4 book ai didi

java - 设置这个引用线程安全吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:48 25 4
gpt4 key购买 nike

关于这段代码是否是线程安全的,我总是得到不同的答案。我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com