use*_*356 6 java multithreading
说我有一个数组[a,b,c,d]
线程A想要向集合中添加新元素e.CopyOnWriteArrayList
创建新数组,复制旧数组中的所有值,添加新元素e,然后使用元素e更新对新数组的引用.
线程A复制值时,线程B也想添加新元素f.因此,它没有复制所有值Ë增加˚F,然后更新参考阵列.
在这种情况下,阵列中可能没有元素e.
如何在这里实现线程安全?
所有的修饰方法(add
,set
,remove
,clear
,等)被锁把守.这就是你如何正确的写入顺序.但是,由于写时复制,这意味着每个支持数组都是有效的不可变的,这意味着只读操作不需要锁定.(持有支持数组的字段是volatile
,因此您仍然可以获得正确的事先发生行为.)