cha*_*ika 15 java collections concurrency data-structures
Javadocs CopyOnWriteArrayList说
ArrayList的线程安全变体,其中通过创建底层数组的新副本来实现所有可变操作(添加,设置等).
我现在很困惑,其他线程何时会看到这个新副本中存在的变化?这是否意味着底层数组的副本数量等于集合的突变数量?如果不是这样,何时将这些单个副本的更改传输到基础数组,以便其他线程可以看到它们?
Joh*_*int 18
这里的想法是,无论何时添加或删除CopyOnWriteArrayList,底层数组基本上都会随修改一起复制.
这是否意味着底层数组的副本数量等于集合的突变数量
是的,对于每个更新ArrayList持有旧版本的所有其他线程的线程,本质上都是引用不同的数组.
何时将这些单个副本的更改传输到基础数组,以便其他线程可以看到它们?
您当前正在查看的数组(假设您的迭代器)将永远不会更改.从数组中读取时,您正在阅读它,就像您开始阅读时一样.如果CopyOnWriteArrayList由另一个线程进行更改,则您当前正在观察的阵列将不受影响.
要获得最新版本,请执行新的读取操作 list.iterator();
话虽这么说,更新这个集合很多将杀死性能.如果你试图排序,CopyOnWriteArrayList你会看到列表抛出一个UsupportedOperationException(排序调用集合上的N次).只有在读取90%以上的读数时才应该使用此读数.