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

读读之间相容,

写写之间互斥,

读写操作相容.

实现方法:

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

    private static class CopyOnWriteList<E>
{
private transient ReentrantLock lock = new ReentrantLock(); private transient volatile Object array[]; CopyOnWriteList()
{
array = new Object[];
} Object[] getArray()
{
return array;
} void setArray(Object[] objs)
{
array = objs;
} int sizeof()
{
return getArray().length;
} boolean empty()
{
return sizeof() == ;
} @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 + );
newElements[length] = e;
setArray(newElements);
return true;
}
finally
{
lock.unlock();
} } }

注意:

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

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

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

CopyOnWriteList-JDK1.8的更多相关文章

  1. CentOS安装JDK-1.7

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. #准备工作# 准备用rpm下载前,看系统是否已经安装有JDK,如果没有则进入正式安装步骤. # rpm -qa | grep jd ...

  2. ubuntu 14.04 配置 jdk1.8

    自己在Ubuntu中安装jdk1.8的步骤,记录以方便以后查询. 将下载好的jdk安装包移到/usr/local目录中(我喜欢将自己安装的软件放在/usr/local目录中),解压缩 sudo tar ...

  3. Linux下安装jdk1.7、Apache-tomcat7

    首先说明下我的主机环境:主机:32位win7 虚拟机:VMware Workstation10.0.1 linux:红帽子centos6.4 jdk1.7 Apache-tomcat7 java环境需 ...

  4. Linux配置JDK1.7和Resin4.0

    1.安装JDK1.7 (1)下载 官网下载路径:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18802 ...

  5. JDK1.5/1.6/1.7之新特性总结(转载)

    原文地址:http://www.cnblogs.com/yezhenhan/archive/2011/08/16/2141510.html 如果原作者看到不想让我转载请私信我! 开发过程中接触到了从j ...

  6. centos7.0 下安装jdk1.8

    centos7.0这里安装jdk1.8采用yum安装方式,非常简单. 1.查看yum库中jdk的版本 [root@localhost ~]# yum search java|grep jdk 2.选择 ...

  7. centos6.6 安装jdk1.7

    1:在oracle官网下载jdk liunx版本,放入到虚拟机中 2:解压jdk,解压命令 tar -xvzf jdk-7u15-linux-x64.tar.gz 解压完成(如下图) 3:在/usr/ ...

  8. HashMap源码阅读笔记(基于jdk1.8)

    1.HashMap概述: HashMap是基于Map接口的一个非同步实现,此实现提供key-value形式的数据映射,支持null值. HashMap的常量和重要变量如下: DEFAULT_INITI ...

  9. Ubuntu14.04或16.04下安装JDK1.8+Scala+Hadoop2.7.3+Spark2.0.2

    为了将Hadoop和Spark的安装简单化,今日写下此帖. 首先,要看手头有多少机器,要安装伪分布式的Hadoop+Spark还是完全分布式的,这里分别记录. 1. 伪分布式安装 伪分布式的Hadoo ...

  10. CentOS6.4安装JDK1.7

    安装说明 1.安装环境: CentOS6.4 64位系统 2.安装方式:rpm安装 3.软 件 包:jdk-7u71-linux-x64.rpm 4.下载地址:http://www.oracle.co ...

随机推荐

  1. php结合phantomjs实现网页截屏、抓取js渲染的页面

    首先PhantomJS快速入门 PhantomJS是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, ...

  2. Vivado HLS初识---阅读《vivado design suite tutorial-high-level synthesis》(5)

    Vivado HLS初识---阅读<vivado design suite tutorial-high-level synthesis>(5) 1.创建工程 启动vidado HLS co ...

  3. 关于vivado----xdc文件时钟约束的初识

    关于vivado----xdc文件时钟约束的初识 1.Primary Clocks(主时钟) 然而,对于比较复杂的时钟: 2.某个模块采用的主时钟(比如说GT) 3.时钟分频 4.复杂一点的时钟描述 ...

  4. VUE简单组件通信

    [x] 1.prop组件通信 1.简单理解 2.多层嵌套 [x] 2.使用ref进行组件通信 [x] 3.$emit组件通信 1.prop组件通信 1.简单理解 有点类似于应式的感觉,我不管你要不要只 ...

  5. 跟着未名学Office - 高效笔记OneNote

    了解OneNote 2016年12月22日    19:57 OneNote Summary 理解OneNote中的笔记本.分区.页的概念 编写人:未名 感谢秦大: http://www.zloffi ...

  6. Python使用plotly绘制数据图表的方法

    转载:http://www.jb51.net/article/118936.htm 本篇文章主要介绍了Python使用plotly绘制数据图表的方法,实例分析了plotly绘制的技巧. 导语:使用 p ...

  7. Hadoop概念学习系列之谈hadoop/spark里分别是如何实现容错性?(四十二)

    Hadoop使用数据复制来实现容错性(I/O高) Spark使用RDD数据存储模型来实现容错性.  RDD是只读的.分区记录的集合.如果一个RDD的一个分区丢失,RDD含有如何重建这个分区的相关信息. ...

  8. chrome 抓包的小功能--preserve log (记录页面跳转后,所有的抓包记录)

    1.记录页面跳转后,所有的抓包记录,勾上

  9. [转][C#][WebApi]

    在 WebApi 中获取网页在服务器上的位置可以使用以下两种方式: string filePath = HostingEnvironment.MapPath(string.Format("/ ...

  10. if判断、while循环、for循环

    一. if判断 基本结构: if 执行语句1 print(代码块1); print(代码块2); # 满足执行语句1时,执行代码块1和代码块2,否则只执行代码块2. if 执行语句1 print(代码 ...