zoukankan      html  css  js  c++  java
  • JDK-1.8-CopyOnWriteSet

    CopyOnWriteSet

    看了下CopyOnWriteSet源码,底层使用的是CopyOnWriteList,根据底层的实现,每次读取都是N的复杂度.每次写也是N的复杂度.有个代码可以看一下,

    来自CopyOnWriteList

     public boolean addIfAbsent(E e) {
            Object[] snapshot = getArray();
            return indexOf(e, snapshot, 0, snapshot.length) >= 0 ? false :
                addIfAbsent(e, snapshot);
        }
     private boolean addIfAbsent(E e, Object[] snapshot) {
            final ReentrantLock lock = this.lock;
            lock.lock();
            try {
                Object[] current = getArray();
                int len = current.length;
                if (snapshot != current) {
                    // Optimize for lost race to another addXXX operation
                    int common = Math.min(snapshot.length, len);
                    for (int i = 0; i < common; i++)
                        if (current[i] != snapshot[i] && eq(e, current[i]))
                            return false;
                    if (indexOf(e, current, common, len) >= 0)
                            return false;
                }
                Object[] newElements = Arrays.copyOf(current, len + 1);
                newElements[len] = e;
                setArray(newElements);
                return true;
            } finally {
                lock.unlock();
            }
        }

    代码的逻辑如下,获取数组snapshot,执行indexOf,如果没有,准备把新元素加入进去.

    在实际加入方法内,获取锁,获取最新的数组current,如果俩个指针还是同一个指针,那就是没有改变,要不然.

    取来个数组长度的最小值.

    对current里面获取改变后的元素执行eq方法.对未比较过的元素执行indexof方法.要是还是没有重复的方法,就加入e

  • 相关阅读:
    微信上传图片
    HTMl5的sessionStorage和localStorage
    ADO.NET使用using关闭数据库连接
    上传插件(WebUploader)
    jQuery文件分片上传
    SQL Server查询已锁的表及解锁
    Hadoop到底能做什么?怎么用hadoop?
    Hadoop使用场景
    WinForm中DataGridView的快速查找及将指定行显示到第一行
    WinForm中DataGridView的全选与取消全选
  • 原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/9446431.html
Copyright © 2011-2022 走看看