关于CopyOnWriterArrayList的一些理解

学了cowarraylist之后,有些不明白的地方,

1.我们为什么要用写时复制的策略呢?,这样每次不是都要复制吗,性能不是很低吗?直接在元素组上扩容不好吗?而且读的时候数据一致性也保证不了,如果只是对一个数组进行操作,那么应该是可以保证的。

2.一些理解:我们为什么用写时复制呢?因为之前的同步容器vector的所有方法都加了同步锁,所以效率非常低。

可以这样来理解,我们要保证并发的性能,所以对于读这个操作可以理解,大家所有线程都读一个数组,效率肯定很高,但是在写的时候我们又想读的话,怎么办呢?这时候就可以将原数组复制一份出来对其进行写的操作,也就是修改操作,而这时候你仍然是可以读的,因为在cowarraylist中读操作根本没有加锁,它的结构中内置了1把锁,我们修改删除的时候获取到那个锁对复制出来的数组进行操作,而这时候你也是可以读的,但是这里就出现了一个问题,就是数据一致性的问题,你读的元素还是原来的那个数组,你并不能读取到我们在修改过后的数组,只有修改完成之后,array指向了改后的数组,你在这之后读取到的数组才是新的数组。这跟迭代器的问题一样。

3.如果直接在原数组上操作,那么你就要加锁,所以这时候你连原数组都读取不了,性能会比较差(我觉得应该会变差)。

posted @ 2019-10-28 10:27  小路不会迷路  阅读(453)  评论(0编辑  收藏  举报