关于java锁正确的是什么 |
您所在的位置:网站首页 › 下面关于java中包的说法正确的是什么 › 关于java锁正确的是什么 |
CopyOnWriteArrayList的实现原理 在使用CopyOnWriteArrayList之前,我们先阅读其源码了解下它是如何实现的。以下代码是向ArrayList里添加元素,可以发现在添加的时候是需要加锁的,否则多线程写的时候会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); }CopyOnWriteArrayList适用于读多写少的并发场景 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |