如何以原子方式替换非同步的并发列表或数组

时间:2014-11-20 01:58:42

标签: java concurrency java.util.concurrent readwritelock copyonwritearraylist

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

更新列表后,只会将其替换为其他版本(没有add()remove()来电。)

A 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来实现线程安全设置?

1 个答案:

答案 0 :(得分:1)

对ReadWriteLock的需求取决于您需要实现的目标。 如果要确保以原子方式更新引用,可以使用AtomicReference(或者在您的情况下足以将此引用标记为volatile),但是如果您的目标是更新程序线程应该等到所有读取线程完成迭代更新引用之前的列表然后是ReadWriteLock。