首页 > 编程 > Java > 正文

Java实例学习 Java并发编程之java.util.concurrent.CopyOnWriteArrayList

2019-11-08 19:37:53
字体:
来源:转载
供稿:网友

CopyOnWriteArrayList

  CopyOnWriteArrayList是ArrayList在并发环境下的替代品。CopyOnWriteArrayList通过增加写时复制语义来避免并发访问引起的问题,也就是说任何修改操作都会在底层创建一个列表的副本,也就意味着之前已有的迭代器不会碰到意料之外的修改。这种方式对于不要严格读写同步的场景非常有用,因为它提供了更好的性能。记住,要尽量减少锁的使用,因为那势必带来性能的下降(对数据库中数据的并发访问不也是如此吗?如果可以的话就应该放弃悲观锁而使用乐观锁),CopyOnWriteArrayList很明显也是通过牺牲空间获得了时间(在计算机的世界里,时间和空间通常是不可调和的矛盾,可以牺牲空间来提升效率获得时间,当然也可以通过牺牲时间来减少对空间的使用)。 

这里写图片描述

举例:

import java.util.ArrayList;import java.util.List;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 Test05 {    private static final int THREAD_POOL_SIZE = 2;    public static void main(String[] args) {        List<Double> list = new ArrayList<>();        ExecutorService es = Executors.newFixedThreadPool(THREAD_POOL_SIZE);        es.execute(new AddThread(list));        es.execute(new AddThread(list));        es.shutdown();    }}

运行报错:Exception in thread "pool-1-thread-1" java.lang.ArrayIndexOutOfBoundsException: 549at java.util.ArrayList.add(ArrayList.java:459)

上面的代码会在运行时产生ArrayIndexOutOfBoundsException,

试一试将上面代码的ArrayList换成CopyOnWriteArrayList再重新运行。

List<Double> list = new CopyOnWriteArrayList<>();11

运行不报错

拓展:

public interface ExecutorService extends Executor {}

public interface Executor {}

public class Executors {}

转载自:http://blog.csdn.net/jackfrued/article/details/44499227


上一篇:java集合概述

下一篇:JAVA 数组常用方法

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表