请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

copyonwriteArrayList并发容器

老师,copyonwriteArrayList的读没有加锁,为什么还是线程安全的呢?

public E get(int index) {
   return get(getArray(), index);
}

当一个线程copyonwriteArrayList调用add(int index, E element)时,另一个线程读的时候是原来的数组数据,不是脏读了吗?



正在回答

1回答

Jimin 2018-07-10 07:52:52

你好,CopyOnWriteArrayList不适用于实时读的场景,像拷贝数组、新增元素都需要时间,所以调用一个set操作后,读取到数据可能还是旧的,虽然CopyOnWriteArrayList 能做到最终一致性,但是还是没法满足实时性要求。因此如果对实时要求特别高,那么CopyOnWriteArrayList 可能确实不太适合,他主要用于读多写少的情景,这代表实际的写理论上会非常少,而且是通过最终数据的正确来保证线程安全。
如果任何一个时间点都期望数据是正确的,那么这时候应该考虑使用同步容器,并发容器没法取代同步容器,并发容器更多的是在保证线程安全的大前提下,尽可能提升并发的性能

1 回复 有任何疑惑可以回复我~
  • 提问者 嗯嗯_不错 #1
    老师一说有豁然开朗的感觉,谢谢老师。
    回复 有任何疑惑可以回复我~ 2018-07-10 09:45:38
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信