博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDK 1.8.0_144 集合框架之CopyOnWriteArrayList
阅读量:5903 次
发布时间:2019-06-19

本文共 658 字,大约阅读时间需要 2 分钟。

  hot3.png

ArrayList  是不支持多个线程同时进行操作的。

ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。

CopyOnWriteArrayList 的增删改是在copy的副本上进行的,并且进行操作时使用了ReentrantLock进行了lock操作,此操作不会影响对原来数组的读,故CopyOnWriteArrayList是能够进行并发读的。

并且由于读是没有上锁的,故读操作和写操作没有偏序关系,为了使得写操作对读操作是可见的,因此 elementData 使用 volalite 进行修饰。 

CopyOnWriteArraySet 底层使用CopyOnWriteArrayList存储数据。

添加时使用了addIfAbsent和addAllAbsent方法来保证CopyOnWriteArrayList元素的唯一性。

addIfAbsent(E e) 方法未加锁,发现存在于snapshot后就直接返回。

不存在于snapshot时调用私有的addIfAbsent(E e, Object[] snapshot) 方法,该方法有加锁。

这是一种典型的compare-add用法。

    addAllAbsent 方法从一开始就进行了加锁操作。

 

addIfAbsent   和  putIfAbsent 机制

List使用add方法 , Map使用put方法

转载于:https://my.oschina.net/qidis/blog/1503366

你可能感兴趣的文章
hdu 1221 Rectangle and Circle
查看>>
Android 四大组件之四(ContentProvider)
查看>>
Android 四大组件之一(Activity)
查看>>
扫描(一)
查看>>
PIE SDK矢量数据的读取
查看>>
两种方式分别改变alertdialog的宽和高
查看>>
TextView-setCompondDrawables用法
查看>>
Centos7安装rabbitmq server 3.6.0
查看>>
iostat命令学习
查看>>
SQL 三种分页方式
查看>>
查看linux是ubuntu还是centos
查看>>
html video的url更新,自动清缓存
查看>>
IOS Xib使用——为控制器添加Xib文件
查看>>
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤
查看>>
【11】ajax请求后台接口数据与返回值处理js写法
查看>>
Python菜鸟之路:Jquery Ajax的使用
查看>>
LeetCode算法题-Maximum Depth of Binary Tree
查看>>
Cox 教学视频5
查看>>
Jenkins持续集成学习-搭建jenkins问题汇总
查看>>
使用ffmpeg实现对h264视频解码 -- (实现了一个易于使用的c++封装库)
查看>>