java - 值可变的并发安全容器的线程安全

标签 java concurrency nested thread-safety

假设我有一个确保线程安全的映射(检索完全并发)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/

相关文章:

java - Volatile:为什么要阻止编译器重新排序代码

java - 在 Android 上充电时在屏幕上显示图像

ElasticSearch 2.4 - 主要类型和嵌套类型之间的查询字符串或

concurrency - D taskpool 等到所有任务完成

java - 使RelativeLayout可滚动

mysql - 嵌套集过滤

Java - PDFBox - 文本提取

java - 从 Java 中的多个类继承(并且可能不使用接口(interface))

java - 执行器是否意味着被重用?

java - java.util.concurrent.ConcurrentHashMap.putIfAbsent 是否需要在同步块(synchronized block)中?