java - ArrayList放入j.u.c.ConcurrentHashMap后会安全发布吗?

标签 java thread-safety java.util.concurrent concurrenthashmap

我对 ArrayList 的安全发布有一些疑问。

我有代码:

private final Map<Long, SomeStuff> map = new ConcurrentHashMap<>();
//Called by Thread 1
public void write() {
   List list = new ArrayList<>();
   for (int i = 0; i <100 ; i++) {
      list.add(new SomeStuff(i))
   }
   map.put(1L,list)
}
// Called by Thread 2
public void read() {
   List list = map.get(1L);
}

调用map.get(1L)是否会返回处于正确状态的ArrayList(例如具有正确的大小)?

ArrayList 的元素呢?这些元素会安全发布吗?

我注意到 ConcurrentHashMap.put 由 Node 上的锁保护,它将被修改,但是 ConcurrentHashMap.get 通过 Unsafe.getObjectVolatile 执行。

我认为 ArrayList 发布可能不安全

谢谢!

最佳答案

ConcurrentHashMap 将是线程安全的,但 ArrayList 则不然

表示如果读取器在写入器调用put之前调用get,则结果将为null。如果编写器在读取器的 get 调用之前调用 put,则结果将是 List 对象

因此,如果您将项目添加到列表中(代码如下)

for (int i = 0; i <100 ; i++) {
   list.add(new SomeStuff(i))
}

put之前就可以了,因为阅读器无法访问列表

但如果在 put 之后,读取器就可以访问它,并导致读取器和写入器同时读取或写入 ArrayList。这可能会导致问题,因为 ArrayList 不是线程安全的。

关于java - ArrayList放入j.u.c.ConcurrentHashMap后会安全发布吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45059031/

相关文章:

c# - 如何在单独的线程中执行 IronPython 脚本然后挂起它?

java - 以下是线程安全的吗? 4个线程写入相同的数据结构

java - ConcurrentHashMap 的线程安全

java - 如何在java中使用TimeUnit

java - FixedThreadPool 与 CachedThreadPool : the lesser of two evils

java - spring.jpa.hibernate.ddl-auto = update mariadb无法自动创建数据库索引或外键或列

java - 使用Spring的@Configuration类的缺点

java - 从其封闭类的静态方法中实例化一个内部类

java - 如何确定单个 Java 执行器服务中管道中的所有任务何时完成

java - 从 java LL 中删除特定项目