一、CopyOnWriteArraySet简介
1. CopyOnWriteArraySet继承于AbstractSet,这就意味着它是一个集合。
2. CopyOnWriteArraySet包含CopyOnWriteArrayList对象,它是通过CopyOnWriteArrayList实现的。而CopyOnWriteArrayList本质是个动态数组队列,所以CopyOnWriteArraySet相当于通过通过动态数组实现的“集合”! CopyOnWriteArrayList中允许有重复的元素;但是,CopyOnWriteArraySet是一个集合,所以它不能有重复集合。因此,CopyOnWriteArrayList额外提供了addIfAbsent()和addAllAbsent()这两个添加元素的API,通过这些API来添加元素时,只有当元素不存在时才执行添加操作! 至于CopyOnWriteArraySet的“线程安全”机制,和CopyOnWriteArrayList一样,是通过volatile和互斥锁来实现的。这个在前一章节介绍CopyOnWriteArrayList时数据结构时,已经进行了说明,这里就不再重复叙述了。二、CopyOnWriteArraySet源码分析
2.1、类图结构
2.2、数据结构
2.3、CopyOnWriteArraySet中的lock
并发控制使用CopyOnWriteArrayList的ReentrantLock
2.4、成员变量
private final CopyOnWriteArrayList al;
2.5、构造函数
public CopyOnWriteArraySet() { al = new CopyOnWriteArrayList(); }
2.6、增加元素
public boolean add(Object obj) { return al.addIfAbsent(obj); }
2.7、remove
public boolean remove(Object obj) { return al.remove(obj); }
2.8、是否存在元素
public boolean contains(Object obj) { return al.contains(obj); }
2.9、size
public int size() { return al.size(); }
2.10、clear
public void clear() { al.clear(); }
三、JDK或开源框架中使用
四、示例
package com.dxz.concurrent.cow;import java.util.Iterator;import java.util.Set;import java.util.concurrent.CopyOnWriteArraySet;public class CopyOnWriteArraySetTest1 { // TODO: set是HashSet对象时,程序会出错。 // private static Setset = new HashSet (); private static Set set = new CopyOnWriteArraySet (); public static void main(String[] args) { // 同时启动两个线程对set进行操作! new MyThread("ta").start(); new MyThread("tb").start(); } private static void printAll() { String value = null; Iterator iter = set.iterator(); while (iter.hasNext()) { value = (String) iter.next(); System.out.print(value + ", "); } System.out.println(); } private static class MyThread extends Thread { MyThread(String name) { super(name); } @Override public void run() { int i = 0; while (i++ < 10) { // “线程名” + "-" + "序号" String val = Thread.currentThread().getName() + "-" + (i % 6); set.add(val); // 通过“Iterator”遍历set。 printAll(); } } }}
结果:
ta-1, tb-1, ta-1, tb-1, ta-1, tb-1, ta-1, tb-1, ta-2, ta-1, tb-1, ta-2, ta-2, tb-2, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-1, tb-1, ta-2, tb-2, ta-3, tb-2, ta-3, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-4, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-4, ta-5, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-3, tb-4, tb-5, tb-0, tb-4, tb-5, tb-0, ta-4, ta-5, ta-0, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-4, ta-5, ta-0, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-4, ta-5, ta-0, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-4, ta-5, ta-0, ta-1, tb-1, ta-2, tb-2, ta-3, tb-3, tb-4, tb-5, tb-0, ta-4, ta-5, ta-0,