我有一个List
多次读取(迭代)和多个线程,但很少更新(读取次数超过50,000倍)。编辑:事实上,在这种情况下,数组就足够了,而不是列表。
当列表更新时,它只是替换为不同的版本(没有add()
或remove()
调用)。
CopyOnWriteArrayList 避免了同步列表的缺点,但我不确定将列表设置为新值是否是原子的。我也读过这个问题。
以显示一些代码。将以下内容视为单例春豆的属性。
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(或者在您的情况下足以将此引用标记为易失性),但是,如果您的目标是更新程序线程应等到所有读取线程完成对旧列表的迭代后再更新引用,那么ReadWriteLock是要走的路。