[性能优化]读多写少使用copywrite

252 阅读1分钟

优点:

读操作性能很高,比较适用于读多写少的并发场景。

Java的list在遍历时,若中途有别的线程对list容器进行修改,则会抛出ConcurrentModificationException异常。

而CopyOnWriteArrayList由于其"读写分离"的思想,遍历和修改操作分别作用在不同的list容器,所以在使用迭代器进行遍历时候,也就不会抛出ConcurrentModificationException异常。

缺点:

  • 内存占用问题,执行写操作时会发生数组拷贝。 如果CopyOnWriteArrayList经常要增删改里面的数据,经常要执行add()、set()、remove()的话,那是比较耗费内存的。每次add()、set()、remove()这些增删改操作都要复制一个数组出来。

  • 无法保证实时性,Vector对于读写操作均加锁同步,可以保证读和写的强一致性。 而CopyOnWriteArrayList由于其实现策略的原因,写和读分别作用在新老不同容器上,在写操作执行过程中,读不会阻塞但读取到的却是老容器的数据。

使用场景

CopyOnWrite并发容器用于读多写少的并发场景。比如白名单,黑名单,商品类目的访问和更新场景。