文档章节

copyOnWrite

o
 ovirtKg
发布于 2017/03/21 14:33
字数 359
阅读 6
收藏 0

写时复制,读与写不冲突,并发执行,而写时是将原有数据上锁,copy一份,原有数据不动,对copy后的数据进行对应的操作。最后将copy后的值 设置为当前对象的数据。在某些情况下,可能会导致数据并不一一致。读到的数据不一定的最新的。

对于JDK中的实现

CopyOnWriteArrayList

对于CowArrayList 内部是一个object类型的数组。而写操作是通过 ReentrantLock实现。

public E get(int index) {
    return get(getArray(), index);
}
public Object[] toArray() {
    Object[] elements = getArray();
    return Arrays.copyOf(elements, elements.length);
}

如上对于读操作并没有上锁。而对于list中的add操作与 remove操作等写操作时,要用lock上锁。

public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        newElements[len] = e;
        setArray(newElements);
        return true;
    } finally {
        lock.unlock();
    }
}
public E remove(int index) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        E oldValue = get(elements, index);
        int numMoved = len - index - 1;
        if (numMoved == 0)
            setArray(Arrays.copyOf(elements, len - 1));
        else {
            Object[] newElements = new Object[len - 1];
            System.arraycopy(elements, 0, newElements, 0, index);
            System.arraycopy(elements, index + 1, newElements, index,
                             numMoved);
            setArray(newElements);
        }
        return oldValue;
    } finally {
        lock.unlock();
    }
}

 

内存占用问题   在某些时刻,数据占用内存扩大一倍,可能导致gc,性能下降。

数据一致性   只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。

© 著作权归作者所有

共有 人打赏支持
上一篇: 事务与锁
下一篇: ReentrantReadWriteLock
o
粉丝 3
博文 57
码字总数 48798
作品 0
景德镇
私信 提问
聊聊并发-Java中的Copy-On-Write容器

Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改...

Hosee
2016/04/21
194
0
聊聊并发-Java中的Copy-On-Write容器

public boolean add(T e) { } final void setArray(Object[] a) { } public E get(int index) { } import java.util.Collection;import java.util.Map;import java.util.Set; public class C......

清尘V
2016/04/21
13
0
CopyOnWriteArrayList分析

参考文章:http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候...

放了一周的酸梅汤
2017/11/05
0
0
Java中的Copy-On-Write容器

什么是CopyOnWrite容器 CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容...

鼎子
2016/02/23
27
0
Java中的CopyOnWrite容器

Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改...

be_free
2014/05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
22分钟前
1
0
burpsuite无法抓取https数据包

1.将浏览器和burpsuite的代理都设置好 2.在浏览器地址栏输入: http://burp 3.下载下面的证书,并将证书导入浏览器 cacert.der

Frost729
47分钟前
0
0
JeeSite4.x 消息管理、消息推送、消息提醒

实现统一的消息推送接口,包含PC消息、短信消息、邮件消息、微信消息等,无需让所有开发者了解消息是怎么发送出去的,只需了解消息发送接口即可。 所有推送消息均通过 MsgPushUtils 工具类发...

ThinkGem
今天
6
0
OpenML

https://www.openml.org/search?type=data

shengjuntu
今天
2
0
java强引用,软引用,弱引用和虚引用

先来简要说一下这四种引用的特性: 强引用:如果一个对象具有强引用,那垃圾回收器绝不会回收它 软引用:如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它 弱引用:在垃圾...

woshixin
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部