gpt4 book ai didi

Java 可见性 : final static non-threadsafe collection changes after construction

转载 作者:搜寻专家 更新时间:2023-11-01 02:23:31 25 4
gpt4 key购买 nike

我找到了 following code snippet在 luaj 中,我开始怀疑是否有可能在 Map 构建之后对它所做的更改可能对其他线程不可见,因为没有适当的同步。

我知道,由于 Map 被声明为 final,它在构造后的初始化值对其他线程可见,但是之后发生的变化呢。

有些人可能还意识到这个类不是线程安全的,以至于在多线程环境中调用 coerce 甚至可能导致 HashMap 中的无限循环,但我的问题不是关于那个。

public class CoerceJavaToLua {
static final Map COERCIONS = new HashMap(); // this map is visible to all threads after construction, since its final

public static LuaValue coerce(Object paramObject) {
...;
if (localCoercion == null) {
localCoercion = ...;
COERCIONS.put(localClass, localCoercion); // visible?
}
return ...;
}

...
}

最佳答案

您是正确的,对 Map 的更改可能对其他线程不可见。访问COERCIONS(读和写)的每个方法都应该在同一个对象上同步。或者,如果您永远不需要原子访问序列,您可以使用 synchronized collection .

(顺便说一句,你为什么要使用原始类型?)

关于Java 可见性 : final static non-threadsafe collection changes after construction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32194726/

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