gpt4 book ai didi

java - 如何原子地替换非同步并发列表或数组

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:08 25 4
gpt4 key购买 nike

我有一个 List 通过多个线程多次读取(迭代),但很少更新(读取次数增加了 50,000 倍以上)。编辑:事实上,在这种情况下,一个数组就足够了,而不是一个列表。

当列表更新时,它只是被替换为不同的版本(没有 add()remove() 调用)。

一个CopyOnWriteArrayList避免同步列表的缺点,但我不确定将列表设置为新值是否是原子的。我读过this还有问题。

显示一些代码。将以下内容视为单例 Spring bean 的属性。

List<MyObject> myList; //the list read many times and concurrently. 

//called by many threads
public void doStuff(){
for (MyObject mo : myList){
//do something
}
}

//called rarely. It's synchronized to prevent concurrent updates
//but my question is about thread-safety with regards to readers
public synchronized void updateList(List<MyObject> newList){ // newList is a CopyOnWriteArrayList<>();
myList = myNewList; //is this following statement executed atomically and thread-safe for readers?
}

我需要使用 ReadWriteLock为了实现线程安全集?

最佳答案

是否需要 ReadWriteLock 取决于您需要实现的目标。如果您想确保引用自动更新,您可以使用 AtomicReference (或者在您的情况下足以将此引用标记为 volatile ),但是如果您的目标是更新程序线程应该等到所有读取线程完成对旧列表的迭代后再更新引用,那么 ReadWriteLock 就是正确的选择。

关于java - 如何原子地替换非同步并发列表或数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27030458/

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