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