zoukankan      html  css  js  c++  java
  • 浅谈CopyOnWriteArraySet

    CopyOnWriteArraySet结构图
     
    CopyOnWriteArraySet.png
    CopyOnWriteArraySet主要方法
    • public boolean add(E e);
    • public boolean remove(Object o);
    CopyOnWriteArraySet解读主要方法

    来看一下public boolean add(E e)源码

     public boolean add(E e) {
            //这个al就是CopyOnWriteArrayList也就是说CopyOnWriteArraySet内部是用CopyOnWriteArrayList来实现的
            return al.addIfAbsent(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();
            }
        }
    

    来看一下 public boolean remove(Object o)源码

      public boolean remove(Object o){
            return al.remove(o);
        }
    //调用CopyOnWriteArrayList的删除
    
    CopyOnWriteArraySet遍历介绍

    常用的遍历方式:

           //one  foreach  遍历
            for (Object o : list) {
                System.out.println(o);
            }
            //two 迭代器的遍历
            Iterator iterator = list.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
    
    CopyOnWriteArraySet其他特性介绍
    • 首先,说明一下CopyOnWriteArraySet的数据结构是什么?其实它的结构严格意义来说是一个集合,它的底层实现是利用数组,它的上层实现是CopyOnWriteArrayList。
    • 其次,CopyOnWriteArraySet是一个集合,所以它是不可以放置重复的元素的,它的取重逻辑是在add中体现的。
    • 最后,CopyOnWriteArraySet是利用CopyOnWriteArrayList来实现的,因为CopyOnWriteArrayList是线程安全的,所以CopyOnWriteArraySet操作也是线程安全的。
  • 相关阅读:
    Unity 3(一):简介与示例
    MongoDB以Windows Service运行
    动态SQL中变量赋值
    网站发布IIS后堆栈追踪无法获取出错的行号
    GridView Postback后出错Operation is not valid due to the current state of the object.
    Visual Studio 2010 SP1 在线安装后,找到缓存在本地的临时文件以便下次离线安装
    SQL Server 问题之 排序规则(collation)冲突
    IIS 问题集锦
    linux下安装mysql(ubuntu0.16.04.1)
    apt-get update 系列作用
  • 原文地址:https://www.cnblogs.com/exmyth/p/11588440.html
Copyright © 2011-2022 走看看