社区
Java SE
帖子详情
关于 ReentrantLock和CopyOnWriteArrayList一个疑惑
omg_self
2017-07-22 03:01:15
网上讲到CopyOnWriteArrayList读写分离,看了一下,是写的时候使用了ReentrantLock,读的过程中,新增一个副本;但是在写的过程中还可以进行读,那么这个锁ReentrantLock持有的锁对象(这也是一个疑问?ReentrantLock到底持有的什么)为什么还允许别的进程读???换成Synchronized可不可以??
...全文
341
3
打赏
收藏
关于 ReentrantLock和CopyOnWriteArrayList一个疑惑
网上讲到CopyOnWriteArrayList读写分离,看了一下,是写的时候使用了ReentrantLock,读的过程中,新增一个副本;但是在写的过程中还可以进行读,那么这个锁ReentrantLock持有的锁对象(这也是一个疑问?ReentrantLock到底持有的什么)为什么还允许别的进程读???换成Synchronized可不可以??
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
我爱兔宝宝
2017-07-27
打赏
举报
回复
ReentrantLock是用来保证写操作是互斥的,可以替换为Synchronized 读写的数据不是同一份,所以读的时候是可以写的,只需要写完后,原子的将当前指针指向写入的新数据数组即可。
soton_dolphin
2017-07-27
打赏
举报
回复
ReentrantLock 有两点胜过用synchronized 1. ReentrantLock 有一个tryLock 方法,如果获得不到锁,会即刻放弃,不会造成死锁 2. ReentrantLock 可以跨不同的方法使用,在A方法里加锁,可以在B方法里解锁。 需要注意的是,解锁时,调用unlock方法的次数一定要和lock(), tryLock() 的次数一致。 如果少了,就会造成死锁,如果多了,就会抛出异常
soton_dolphin
2017-07-22
打赏
举报
回复
CopyOnWriteArrayList, 读的是副本的值,写的是原始list的值。
ArrayList
和
Copy
On
Write
ArrayList
1.
ArrayList
查询快而增删慢 1、底层是数组,初始化大小为10 2、插入时会判断数组容量是否足够,不够的化会进行扩容 3、所谓扩容就是新建
一个
数组,然后将老的数据里面的元素复制到新的数组里面 4、移除元素的时候也涉及到数组中元素的移动,删除指定index位置的元素,然后将index+1至数组最后
一个
元素往前移动一格 结论:
ArrayList
底层是数组,所以查询的时候直接根据索引可以很快地找到对应地元素,改也是如此,找到index对应元素进行替换。而增加和删除就涉及到数组元素地移动,所以会比较
线程安全的list之synchronizedList和
Copy
On
Write
ArrayList
在上篇文章中我们已经介绍了其他的一些list集合,如
ArrayList
、linkedlist等。不清楚的可以看下上篇文章一文彻底了解List集合 但是向
ArrayList
这些会出现线程不安全的问题,我们该怎样解决呢?接下来就是要介绍我们线程安全的list集合synchronizedList和
Copy
On
Write
ArrayList
。 一、synchronizedList synchroniz...
Copy
On
Write
ArrayList
的原理和使用方法
https://blog.csdn.net/hua631150873/article/details/51306021
Copy
On
Write
ArrayList
:
Copy
On
Write
ArrayList
这是
一个
ArrayList
的线程安全的变体,其原理大概可以通俗的理解为:初始化的时候只有
一个
容器,很常一段时间,这个容器数据、数量等没有发生变化的时候,大家(多个线程),都是读取(假设这段时间里只...
Copy
On
Write
ArrayList
原理解析
Copy
On
Write
ArrayList
是
一个
线程安全的
ArrayList
,对其进行的修改操作都是在底层的
一个
复制的数组(快照)上进行的,也就是使用了写时复制策略。如图所示是
Copy
On
Write
ArrayList
的类图结构: 上图有个小瑕疵,
lock
是 包级私有,而不是 protected。 能够看到,每个
Copy
On
Write
ArrayList
对象都有
一个
array数组用来存放具体元素,而Re
enTr
ant
Lock
则用来保证只有
一个
线程对Array进行修改。Re
enTr
ant
Lock
本身是
一个
独占锁
Java SE
62,620
社区成员
307,251
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章