前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 写时拷贝容器CopyOnWriteArrayList的测试

Java 写时拷贝容器CopyOnWriteArrayList的测试

作者头像
Jerry Wang
发布2020-04-28 18:29:36
4510
发布2020-04-28 18:29:36
举报

测试代码:

代码语言:javascript
复制
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;
   }
  
  @Override
   public 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());

	}

}

输出结果:

OK, list length: 20000

如果把支持写时拷贝的list替换成普通的ArrayList:

List list = new ArrayList<>();

因为两个线程同时对这个普通的ArrayList进行写操作,结果如下:

OK, list length: 17578

看下CopyOnWriteArrayList实现源代码里Add方法的实现:

代码语言:javascript
复制
/**
     * 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();

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档