gpt4 book ai didi

java - 这个类是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-02 08:38:09 28 4
gpt4 key购买 nike


下面的类是线程安全的吗?

class ImmutablePossiblyThreadsafeClass<K, V> {

private final Map<K, V> map;

public ImmutablePossiblyThreadsafeClass(final Map<K, V> map) {
this.map = new HashMap<K, V>();

for (Entry<K, V> entry : map.entrySet()) {
this.map.put(entry.getKey(), entry.getValue());
}
}

public V get(K key) {
return this.map.get(key);
}
}

最佳答案

如果这是整个类定义,即没有其他 setter/modifier 方法,则映射本身的使用是线程安全的:

  • 通过将其声明为 final 来保护其初始化和可见性,
  • 包含类只有一个 getter,没有修饰方法,
  • 映射的内容是从构造函数参数映射中复制的,因此不能通过外部引用对其进行修改。

(请注意,这仅指 map 的结构 - map 内的各个元素可能仍然不安全。)

更新

关于类不受构造函数参数在构造过程中同时修改的影响的说法,我倾向于同意其他人(包括@Bozho)已经指出的观点

  1. 没有已知的方法可以防止这种情况(甚至没有像@Grundlefleck建议的那样使用ConcurrentHashMap - 我检查了源代码,它的构造函数只是调用putAll() ,也没有防范这一点),
  2. 确保构造函数参数不会被同时修改是调用者的责任,而不是被调用者的责任。事实上,任何人都可以定义处理同时修改的构造函数参数的“正确”行为吗?创建的对象应该包含参数映射中的原始元素,还是最新的元素?...如果有人开始思考这一点,恕我直言,不难意识到唯一一致的解决方案是禁止并发修改构造函数参数,而这只能由调用者来保证。

关于java - 这个类是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5635032/

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