CopyOnWriteList笔记

CopyOnWriteList笔记

概述

CopyOnWriteList 是一个写时复制的策略保证 list 的一致性,所以在其增删改的操作中都使用了独占锁 ReentrantLock 来保证某个时间只有一个线程能对 list 数组进行修改。其底层是对数组的修改,调用 Arrays.copyarray() 方法进行对数组的复制,在底层还是调用的 C++ 去进行的数组的复制 System.copyarray()

修改

在修改时如果需要修改的元素和之前元素值相同,会调用 setAarray(elements) 方法将之前的数组又塞回去,看似很多余,其实之中暗藏玄机。 array 字段是被 volutile 修饰,所以调用 setArray() 方法会是缓存行内的 array 字段缓存失败,并防止指令重拍,即 happens-before 原理

弱一致性的迭代器

当调用迭代器 iterator() 方法时,实际上会返回一个 COWIterator 对象,COWIterator 对象会拿到当前的 array 保存在 snapshot 变量中,cursor 是遍历的游标。

虽然 snapshot 是指针引用,但是,叫快照不符合语义,但是在对 list 进行增删改操作时,其实是操作的是复制出来的新数组,所以 snapshot 不会改变,所以其迭代器是弱一致性的。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值