关于 ReentrantLock和CopyOnWriteArrayList一个疑惑

omg_self 2017-07-22 03:01:15
网上讲到CopyOnWriteArrayList读写分离,看了一下,是写的时候使用了ReentrantLock,读的过程中,新增一个副本;但是在写的过程中还可以进行读,那么这个锁ReentrantLock持有的锁对象(这也是一个疑问?ReentrantLock到底持有的什么)为什么还允许别的进程读???换成Synchronized可不可以??
...全文
285 3 打赏 收藏 转发到动态 举报
写回复
用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的值。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧