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. Excel技巧--空白处补零

    当我们有一表格,而表格的空白单元格要补零时,如下图: 那么手动添加零比较麻烦,特别是行数很多时.可以用如下方法: 1.使用“替换”功能: 查找内容为空,替换处填写0,然后点击全部替换即可. 2.使用定 ...

  2. java中经常使用的Swing组件总结

    1.按钮(Jbutton) Swing中的按钮是Jbutton,它是javax.swing.AbstracButton类的子类,swing中的按钮可以显示图像,并且可以将按钮设置为窗口的默认图标,而且 ...

  3. zzzp0371 属于本人

    所有关于zzzp0371账号,属于本人 如有问题,请在此留言联系我

  4. 【nginx】之常用命令

    查看版本号: nginx -s reload  :修改配置后重新加载生效 nginx -s reopen  :重新打开日志文件nginx -t -c /path/to/nginx.conf 测试ngi ...

  5. C++进阶--显式类型转换(casting)

    //############################################################################ /* * 显式类型转换 * * 类型转换 ...

  6. Python 模块EasyGui详细介绍

    转载:无知小德 Python 模块EasyGui详细介绍 EasyGui 官网: http://easygui.sourceforge.net 官方的教学文档:http://easygui-docs- ...

  7. C++中的指针与引用的区别与联系

    引用与指针实质上都是间接地指代另一个变量,引用相当于该变量的外号或者小名,而指针实质上是指向该变量的地址进而操作该变量 区别1:指针的地址与该变量不同,但引用的地址与该变量相同相同 #include& ...

  8. Python类方法、静态方法与实例方法 -----类里面不需要实例化参数 和没带self的函数 调用此函数的方法

    来源: https://www.cnblogs.com/blackmatrix/p/5606364.html 静态方法是指类中无需实例参与即可调用的方法(不需要self参数),在调用过程中,无需将类实 ...

  9. Oracle空查询删除

           

  10. Linux系统安装(centos6.8)符破解码

    1.安装 VMware VMware 是一个虚拟 PC 的软件,可以在现有的操作系统上虚拟出一个新的硬件环境,相当于模拟出一台新的 PC,我们可以在上面构造出一个或多个别的系统,以此来实现在一台机器上 ...