java中CopyOnWrite容器是什么?实现原理是什么?

BSO 2020-11-05 15:58:33 java常见问答 3408

众所周知,java中有很多的基础知识,应用面是非常广泛的。而且对于不同的知识点所属的方向也是不同的。今天就来为大家介绍一下,java中CopyOnWrite容器是什么以及实现原理是什么?一起来了解一下吧。

首先我们需要知道的是,CopyOnWrite容器即写时复制的容器。

通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。

这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

接下来说一下,CopyOnWriteArrayList的实现原理

可以发现在添加的时候是需要加锁的,否则多线程写的时候会Copy出N个副本出来。代码展示如下:

public boolean add(T 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();
    }
}
final void setArray(Object[] a)
{
    array = a;
}

读的时候不需要加锁,如果读的时候有多个线程正在向ArrayList添加数据,读还是会读到旧的数据,因为写的时候不会锁住旧的ArrayList。代码如下所示:

public E get(int index)
{
    return get(getArray(), index);
}

JDK中并没有提供CopyOnWriteMap,我们可以参考CopyOnWriteArrayList来实现一个,代码如下:

import java.util.Collection;
import java.util.Map;
import java.util.Set;
public class CopyOnWriteMap < K, V > implements Map < K, V > , Cloneable
{
    private volatile Map < K, V > internalMap;
    public CopyOnWriteMap()
    {
        internalMap = new HashMap < K, V > ();
    }
    public V put(K key, V value)
    {
        synchronized(this)
        {
            Map < K, V > newMap = new HashMap < K, V > (internalMap);
            V val = newMap.put(key, value);
            internalMap = newMap;
            return val;
        }
    }
    public V get(Object key)
    {
        return internalMap.get(key);
    }
    public void putAll(Map < ? extends K, ? extends V > newData)
    {
        synchronized(this)
        {
            Map < K, V > newMap = new HashMap < K, V > (internalMap);
            newMap.putAll(newData);
            internalMap = newMap;
        }
    }
}

以上就是关于java中CopyOnWrite容器是什么以及实现原理是什么的主要内容了。内容还是很好理解的。如果你对java知识感兴趣,想要了解更多java常见问题,敬请关注奇Q工具网。

推荐阅读:

java中SSM框架面试题,IOC和AOP底层实现原理

java进度条功能的实现原理是什么?实例展示

reentrantlock底层原理是什么?实现原理解析