博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CopyOnWriteList-JDK1.8
阅读量:7086 次
发布时间:2019-06-28

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

CopyOnWrite,一个写时复制的技术来保证并发操作的安全,使用这种技术的前提是读大于写.

读读之间相容,

写写之间互斥,

读写操作相容.

实现方法:

在对底层数据进行写的时候,把底层数据复制一份,对新的备份进行写,写完后再让原来数据的指针指向新的数据.以下为JDK1.8-CopyOnWriteList类似代码.

private static class CopyOnWriteList
{ private transient ReentrantLock lock = new ReentrantLock(); private transient volatile Object array[]; CopyOnWriteList() { array = new Object[0]; } Object[] getArray() { return array; } void setArray(Object[] objs) { array = objs; } int sizeof() { return getArray().length; } boolean empty() { return sizeof() == 0; } @SuppressWarnings("unchecked") E get(int index) { return (E) getArray()[index]; } boolean set(E e, int index) { final ReentrantLock lock = this.lock; try { lock.lock(); Object[] elements = getArray(); E oldValue = (E) elements[index]; if (oldValue != e) { int length = elements.length; Object[] newElements = Arrays.copyOf(elements, length); newElements[index] = e; setArray(newElements); } else { // 内存的可见性通过volatile的语义来实现,而不是数组的内容 setArray(elements); } return true; } finally { lock.unlock(); } } boolean add(E e) { final ReentrantLock lock = this.lock; try { lock.lock(); Object[] elements = getArray(); int length = elements.length; // Math.min(original.length, newLength) Object[] newElements = Arrays.copyOf(elements, length + 1); newElements[length] = e; setArray(newElements); return true; } finally { lock.unlock(); } } }

注意:

1.锁和底层数据都是transient,锁是基于内存的,所以写入流里没有意义,对于底层的数据,写入也是没有意义,这是一份快照数据.

2.在JDK-CopyOnWriteList底层数组进行增长的时候只+1,所以,会出现大量的复制.

3.在set方法内,即使新加入的元素和oldValue相等,也要setArray,保证volatile的语义.

posted on
2018-08-07 00:15 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/9434358.html

你可能感兴趣的文章
cdn加速
查看>>
为什么学习Linux系统?
查看>>
Windows Server2012上使用Nginx做文件服务器
查看>>
linux下的apache配置
查看>>
app测试和web端测试的区别
查看>>
一瓶汽水1元,两瓶汽水可换一瓶,现有20元,最多可喝多少瓶汽水
查看>>
图文教程自动登录expect脚本实例
查看>>
2019 第四周 开发笔记
查看>>
CORBA分布式实现
查看>>
第五天的学习
查看>>
微信小程序小技巧系列《二》show内容展示,上传文件编码问题
查看>>
Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安
查看>>
$.get()请求返回一个html页面,获取该页面特定id的元素
查看>>
Linux中的加解密实现
查看>>
Java开发GUI之CardLayout卡片布局
查看>>
将自己本地的项目托管到github上
查看>>
yum仓库搭建
查看>>
this怎么用(基础)
查看>>
安装server2008后,提示“Windows无法验证此文件的数字签名”
查看>>
一个中文空格引起的bug
查看>>