• Java中的Copy-On-Write容器(二) --CopyOnWriteArraySet


      CopyOnWriteArraySet 也是JDK 为我们提供的 CopyOnWrite 容器的实现。CopyOnWriteArraySet 是基于CopyOnWriteArrayList 实现的,我们来看下他的源代码是如何实现的:

    private final CopyOnWriteArrayList<E> al;
    public CopyOnWriteArraySet() {
            al = new CopyOnWriteArrayList<E>();
        }
    public boolean add(E e) {
            return al.addIfAbsent(e);
        }
    

      当我们 通过 CopyOnWriteArraySet 构造方法创建 一CopyOnWriteArraySet 对象的时候,其实创建了一个CopyOnWriteArrayList 对象,当我们 调用add(E e) 方法的时候其实是调用了 CopyOnWriteArrayList 的addIfAbsent(E e) 方法:

     public boolean addIfAbsent(E e) {
            final ReentrantLock lock = this.lock;
            lock.lock();
            try {
                // Copy while checking if already present.
                // This wins in the most common case where it is not present
                Object[] elements = getArray();
                int len = elements.length;
                Object[] newElements = new Object[len + 1];
                for (int i = 0; i < len; ++i) {
                    if (eq(e, elements[i]))
                        return false; // exit, throwing away copy
                    else
                        newElements[i] = elements[i];
                }
                newElements[len] = e;
                setArray(newElements);
                return true;
            } finally {
                lock.unlock();
            }
        }
    

      CopyOnWriteArrayList的addIfAbsent方法.adIfAbsent方法同样采用锁保护,并创建一个新的大小+1的Object数组。遍历当前Object数组,如Object数组中已有了当前元素,则直接返回,如果没有则放入Object数组的尾部,并返回。

      由此可见CopyOnWriteArraySet在add时每次都要进行数组的遍历,因此其性能会低于CopyOnWriteArrayList.

  • 相关阅读:
    与MS Project相关的两个项目
    最后的报告bug
    oo第二阶段的总结
    第一阶段的反思和改变
    面向对象设计与构造第四次课程总结
    面向对象设计与构造第三次课程总结
    面向对象设计与构造第一次课程总结
    OO游记之六月篇
    OO游记之五月篇
    OO游记之四月篇
  • 原文地址:https://www.cnblogs.com/gaohuiqian/p/5237752.html
Copyright © 2020-2023  润新知