zoukankan      html  css  js  c++  java
  • java并发:CopyOnWriteArrayList简单理解

    Java集合的快速失败机制 “fail-fast”

    "fail-fast"是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生 fail-fast 机制。

    例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制。

    原因:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。

    CopyOnWriteArrayList

    传统的List在多线程同时读写的时候会抛出java.util.ConcurrentModificationException,

    Vector是线程安全的,但是由于使用了synchronized同步锁,导致同一时间内只有一个线程能访问,效率较低。

    而CopyOnWriteArrayList是使用CopyOnWrite(写时复制)技术解决了这个问题,这一般需要很大的内存开销。

    /**
         * 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) {
            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();
            }
        }
  • 相关阅读:
    很多Python新手教程
    NYOJ 58 步数最少 【BFS】
    页面背景图像的代码
    1001. 杀死吸引力(3n+1)猜想 (15)(ZJUPAT 数学)
    使用JasperReport+iReport进行Web报表开发
    Android学习路径——Android的四个组成部分activity(一)
    1001
    android 拍照注意问题
    springMVC注解优化
    JDBC batch批处理Statement executeBatch 具体解释
  • 原文地址:https://www.cnblogs.com/expiator/p/10105419.html
Copyright © 2011-2022 走看看