CopyOnWriteArrayList 源码解读
创始人
2024-05-28 23:28:24
0

一、CopyOnWriteArrayList 源码解读

JUC 中,对于 ArrayList 的线程安全用法,比较推崇于使用 CopyOnWriteArrayList ,那 CopyOnWriteArrayList是怎么解决线程安全问题的呢,本文带领大家一起解读下 CopyOnWriteArrayList 的源码,主要对几个常用的函数进行讲解。

在进行 CopyOnWriteArrayList 的源码讲解之前,先看下同样实现了线程安全的 Vector ,很多文章都说不推荐使用 Vector ,其主要原因是性能太差了,那性能为什么这么差呢?可以看下 Vector addget 的源码:

在这里插入图片描述
在这里插入图片描述

Vector 的添加和读取操作都被加上了 synchronized 锁,当并发情况下,因为锁的存在相当于变成了单线程的操作,所以效率肯定低,同样这样的优点就是保证了数据的唯一性,不会读取到脏数据。

下面再看下 CopyOnWriteArrayList 是如何解决并发问题的呢。

首先看下 CopyOnWriteArrayList 的全局变量有哪些:

在这里插入图片描述

其中 lock 锁就是每次在做写操作时,锁的句柄,array 就是具体存储数据的数组,注意这里的 arrayvolatile 所修饰,因此可以在并发情况下实现数据的可见性。

new 创建了一个 CopyOnWriteArrayList 时,如果是使用无参的构造函数,则将 array 的长度默认成 0 ,创建了一个空的数组。

在这里插入图片描述
在这里插入图片描述

在使用 add 添加数据时,先使用 lock 上锁,并获取到当前的 array 数组,然后对 array 进行 copyOf,新的数组的长度是之前的长度 +1 ,这样才能存放当前新的值,将新值填充后,再替换掉旧的 array 数组后,释放当前锁。

在这里插入图片描述

在使用 get 获取指定下边数据时,直接对当前的 array 进行操作:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在进行 remove 删除时,先使用 lock 上锁,然后再获取当前的 array 数组,如果传入的 index 正好是最后一个,那么 numMoved 计算出来就是 0 ,则使用 copyOf ,长度进行 -1 去除最后一个数据。否则传入的不是最后一个,先声明一个新的 array 数组,数组的长度就是旧的 arraylen - 1,再将 0index 的数据 arraycopy 至新的 array 数组,然后再将 index + 1 后的再 arraycopy 至新的 array 数组,最后将新的 array 数组替换旧的,然后释放锁。

在这里插入图片描述

二、总结

  1. new 新建一个 CopyOnWriteArrayList 后会生成一个数组 array 来存放添加的内容,如果是无参的构造函数,则 array 的长度为 0 ,添加数据时再进行扩容。同时会声明一个 ReentrantLock 锁。
  2. 当进行 add 操作时,先进行上锁,然后对当前的 array 进行 copyOf,并且新的长度是之前的长度 +1 ,这样才能存放当前新的值,将新值填充后,再替换掉旧的 array 数组后,释放当前锁。
  3. 当使用 get 获取数据时,无需上锁,直接读取当前 array 数组的指定位置。
  4. 当使用 remove 时,同样先进行上锁,然后再获取当前的 array 数组,如果传入的 index 正好是最后一个,则使用 copyOf ,长度进行 -1 ,否则的话先声明一个新的 array 数组,现将0index 的数据 arraycopy 至新的 array 数组,然后再将 index + 1 后的再 arraycopy 至新的 array 数组,最后将新的 array 数组替换旧的,然后释放锁。

读下来之后可以感觉出来 CopyOnWriteArrayList 的源码非常容易理解和阅读,同时我们也可以看出一些问题,CopyOnWriteArrayList 实现了写写隔离,但读读是可以共享的,这就有可能出现当某个数据再修改时,读进行了操作,导致读取到的还是旧的数据。还有就是每次写操作都对数组进行 Copy ,假如数据量非常大的情况下,进行 Copy 消耗的资源则会进行 x 2 ,因此使用 CopyOnWriteArrayList 时,需要考虑下自己的数据量以及读写的频次。

相关内容

热门资讯

《峡江寺飞泉亭记》阅读答案   《峡江寺飞泉亭记》是清代袁枚所作的一篇散文。今天我们一起来学习一下,希望对大家的文言文赏析能力有...
作文 可爱的小花猫 作文 可爱的小花猫作文 可爱的小花猫1  可爱的小花猫    十堰市武当路小学二年级  曹晓雨 指导...
结婚用的对联摘抄 结婚用的对联摘抄  1、并蒂莲花双吐艳,  同心伴侣百年欢。  2、柳丝喜发千枝绿,  桃蕾欣开并蒂...
描写秋天的诗句 关于描写秋天的诗句(精选60句)  在平平淡淡的日常中,大家都知道一些经典的'诗句吧,不同的诗句,其...
雪花像什么的比喻句 雪花像什么的比喻句(精选50句)  雪花纷纷扬扬的飘落下来,像仙女和蝴蝶仙子们的合奏一样。下面是小编...
诸葛亮哭周瑜的歇后语   以下是小编给大家整理的诸葛亮哭周瑜的歇后语,欢迎大家查看!  诸葛亮哭周瑜----假戏真做  有...
中国古代文化常识 关于中国古代文化常识  古代文化常识是指古代称谓习惯、历法、节气、职官定位、地理、礼仪、古代音律、科...
中秋的灯谜答案 关于中秋的灯谜答案(精选100条)  明月当空照,中秋夜团圆。金风送桂雨,举杯合家欢。中秋将至,小编...
中秋佳节结良缘灯谜 中秋佳节结良缘灯谜(精选210句)  灯谜是我国特有的文字游戏,始自古代隐语。它将事物或语句的真相暂...
长城谣阅读答案   由著名诗人席慕蓉创作出一篇《长城谣》,因该诗歌的杰出被载入课本,成为我们广大学子的必学诗歌之一。...
高中语文重要文学常识 高中语文重要文学常识  高中语文有很多的文学常识需要学生掌握,这些都是语文学习的重点之一。下面是小编...
中国四大名著之一《三国演义》... 中国四大名著之一《三国演义》写作背景及作者简介  《三国演义》是中国古典四大名著之一,是中国第一部长...
清蒸鲈鱼作文400字 清蒸鲈鱼作文400字  我长大了,也该学习一些做家务的本领了,这样的话,爸爸妈妈在家就可以多休息一会...
灯谜大全及谜底 灯谜大全及谜底  灯谜又称文虎,猜灯谜,是中国独有的富有民族风格的一种汉族民俗文娱活动形式,是从古代...
小学状物作文辅导 小学状物作文辅导小学状物作文辅导小学状物类作文指导方法谈状物类作文,以“物”为描述的中心和文章的线索...
太阳的比喻句 太阳的比喻句大全  比喻句,就是打比方,用浅显、具体、生动的事物来代替抽象、难理解的事物。以下是小编...
描写鱼外形的比喻句 描写鱼外形的比喻句  它身披一件镶着金黄色鳞片的连衣裙;一双圆溜溜,鼓鼓的眼睛,眨也不眨地注视着周围...
对联怎么贴门左右 对联怎么贴门左右  每一年都会在大年三十之前贴对联,小时候比较高兴的就是贴完对联以后,自己的大门仿佛...
生活谚语 生活谚语大全  在平时的学习、工作或生活中,许多人对一些广为流传的谚语都不陌生吧,谚语内容非常广,类...
常见的谚语 常见的谚语355句  在学习、工作乃至生活中,大家都对那些朗朗上口的谚语很是熟悉吧,谚语大多是反映了...