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

本文共 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

你可能感兴趣的文章
uva live 7638 Number of Connected Components (并查集)
查看>>
Linux下设置svn开机自启动
查看>>
java只能的round,ceil,floor方法的使用
查看>>
雷公藤多甙治疗类风湿关节炎遭质疑
查看>>
Web前端开发学习误区,你掉进去了没?
查看>>
由于无法创建应用程序域,因此未能执行请求。错误: 0x80070002 系统找不到指定的文件...
查看>>
新开的博客,为自己祝贺一下
查看>>
numpy模块资源
查看>>
puppet任务计划
查看>>
nw打包
查看>>
【CQOI2011】放棋子
查看>>
一起来读多视图几何
查看>>
作用域声明提升
查看>>
采用JXL包进行EXCEL数据写入操作
查看>>
***CodeIgniter框架集成支付宝即时到账支付SDK
查看>>
Struts2访问ServletAPI的三种方式
查看>>
一周总结
查看>>
将txt文件转化为json进行操作
查看>>
XML
查看>>
【我的总结20170823】多实例部署
查看>>