栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

「Java」CopyOnWriteArrayList与Vector

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

「Java」CopyOnWriteArrayList与Vector

        我们都知道ArrayList是线程非安全的。如果我们想要得到一个线程安全的集合。有如下方式

  •  new Vector();
  •  Collections.synchronizedList(new ArrayList<>());
  •  new CopyOnWriteArrayList();

他们实现线程安全的方式

  • Vector :简单粗暴
    // add
    public synchronized boolean add(E e) {
            modCount++;
            ensureCapacityHelper(elementCount + 1);
            elementData[elementCount++] = e;
            return true;
        }
    
    // get
    public synchronized E get(int index) {
            if (index >= elementCount)
                throw new ArrayIndexOutOfBoundsException(index);
    
            return elementData(index);
        }
  • Collections.synchronizedList 与Vector类似,也是上种方式。

我们来看看CopyOnWriteArrayList是如何实现线程安全的

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();
        }
    }

        首先CopyOnWriteArrayList其采用的COW思想,即在读的时候使用原来了的集合对象,当需要对集合进行写操作时,我们就创建一个新的对象,提供的这个需要进行修改操作的线程,当所有迭代完成后,再将旧集合的指针指向修改后的新集合。没有扩容机制,减少了扩容浪费的时间。

        还有与上边两种不同的是,CopyOnWriteArrayList的get()方法没有锁。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/830235.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号