Java中的copyOnWrite容器

一、什么是copyOnWrite容器
1)含义:写时拷贝复制。
2)在并发访问的背景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改。修改完成之后,将指向原来容器的引用指向新的容器(副本容器)。

二、优点
1)支持并发的读,而不需要加锁;
2)读写分离,读和写不同的容器。

二、JDK支持
1)CopyOnWriteArraylList

/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return {@code true} (as specified by {@link Collection#add})
*/
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();
}
}

2)CopyOnWriteArraySet(省略)

四、使用场景:CopyOnWrite并发容器用于读多写少的并发场景

五、缺点
1)占用内存大:拷贝容器数组导致

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

六、一个小例子

public class CopyOnWriteListTest {

public static void main(String[] args) throws InterruptedException {

    final List<String> copyOnWriteArrayList = new CopyOnWriteArrayList<String>();

    copyOnWriteArrayList.add("1-old");
    copyOnWriteArrayList.add("2-old");

    /*
    *
    * 读数据线程
    * */
    new Thread() {
        @Override
        public void run() {
            copyOnWriteArrayList.get(1);
        }
    }.start();

    /*
    *
    * 写数据线程
    * */
    new Thread(new Runnable() {
        @Override
        public void run() {
            copyOnWriteArrayList.set(1, "1-new");
        }
    }).start();

    /*
    * sleep  等待线程结束.
    * */
    Thread.sleep(2000);
    System.out.println(copyOnWriteArrayList.get(1));
}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值