Copy-On-Write并发容器

本文介绍了JDK1.5及更高版本中提供的CopyOnWriteArrayList和CopyOnWriteArraySet并发容器。通过读写分离思想,这些容器能显著降低锁竞争并提高并发性能。特别适合于读操作远多于写操作的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,简介

       在JDK1.5以上版本中,提供了CopyOnWriteArrayList,CopyOnWriteArraySet两种并发容器。采用读写分离的思想(读操作在元数据中操作,写操作则在副本中操作),降低锁冲突,提高并发性。

二,实现原理

     

   /**
     *读操作(没有加锁)
     * {@inheritDoc}
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public E get(int index) {
        return (E)(getArray()[index]);
    }

    /**
     * Gets the array.  Non-private so as to also be accessible
     * from CopyOnWriteArraySet class.
     */
    final Object[] getArray() {
        return array;//存放元数据的数组
    }

   /**
    *写操作(加锁的目的:防止并发量大时,产生过多的元数据副本,耗内存)
    */
    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();
	}
    }

    /**
     * Sets the array.
     */
    final void setArray(Object[] a) {
        array = a;
    }

 三,应用场景

     对于读多写少的场景(例如:缓存),可以有效减少锁冲突,提示系统并发能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值