假设我有一个确保线程安全的映射(检索完全并发)ConcurrentHashMap<String, Foo>
其中检索的值是一些可变对象
class Foo {
public Object bar;
}
Foo
值将仅由单个线程构造,添加到映射一次,然后永远不会修改。该操作可能如下所示:
Foo foo = new Foo();
foo.bar = "Test";
concurrentMap.add("key", foo);
在单独的线程中,通过查看映射中的值来执行工作(假设此处预先正确设置了值)
System.out.println(concurrentMap.get("key").bar);
<小时/>
访问 Foo::bar
是否有任何问题在这个情况下?是否存在无法按预期执行的情况?
最佳答案
它应该像将值放入并发散列图和从中取出值一样工作,并应建立发生之前的关系(请参阅 Is ConcurrentHashMap.get() guaranteed to see a previous ConcurrentHashMap.put() by different thread? )。消费者线程应该看到 map 插入之前的条形值。
就我个人而言,我会努力使 Foo (和 bar)对象变得不可变(如果它们永远不会改变为什么不呢?)。
关于java - 值可变的并发安全容器的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52758659/