gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:36:59 25 4
gpt4 key购买 nike

我对 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/

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