Java 写时拷贝容器CopyOnWriteArrayList的测试
生活随笔
收集整理的這篇文章主要介紹了
Java 写时拷贝容器CopyOnWriteArrayList的测试
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
測(cè)試代碼:
package copyOnWriteArrayListTest;import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;class AddThread implements Runnable {private List<Double> list;public AddThread(List<Double> list) {this.list = list;}@Overridepublic void run(){for ( int i = 0; i < 10000; i++){list.add(Math.random());}} }public class CopyOnWriteArrayListTest {public static final int THREAD_POOL_SIZE = 2;public static void main(String[] args) throws InterruptedException {// List<Double> list = new ArrayList<>();List<Double> list = new CopyOnWriteArrayList<>();ExecutorService es = Executors.newFixedThreadPool(THREAD_POOL_SIZE);es.execute(new AddThread(list));es.execute(new AddThread(list));es.shutdown();Thread.sleep(4000);System.out.println("OK, list length: " + list.size());}}輸出結(jié)果:
OK, list length: 20000
如果把支持寫時(shí)拷貝的list替換成普通的ArrayList:
List list = new ArrayList<>();
因?yàn)閮蓚€(gè)線程同時(shí)對(duì)這個(gè)普通的ArrayList進(jìn)行寫操作,結(jié)果如下:
OK, list length: 17578
看下CopyOnWriteArrayList實(shí)現(xiàn)源代碼里Add方法的實(shí)現(xiàn):
/*** 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) {synchronized (lock) {Object[] es = getArray();int len = es.length;es = Arrays.copyOf(es, len + 1);es[len] = e;setArray(es);return true;}}lock初始化的地方:
final transient Object lock = new Object();
總結(jié)
以上是生活随笔為你收集整理的Java 写时拷贝容器CopyOnWriteArrayList的测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个使用Java BlockingQue
- 下一篇: 格莱珉银行的性质