java并发之CopyOnWriteArraySet
CopyOnWriteArraySet是基于CopyOnWriteArrayList实现的,持有CopyOnWriteArrayList的内部对象,它的迭代器也是CopyOnWriteArrayList的迭代器,add操作通过addAllAbsent或者addIfAbsent去重。
例子
1package javalearn.javabase.concurrent; 2 3import lombok.extern.slf4j.Slf4j; 4 5import java.util.HashSet; 6import java.util.Iterator; 7import java.util.Set; 8import java.util.concurrent.CopyOnWriteArraySet; 9 10@Slf4j 11public class CopyOnWriteArraySetTest { 12 private static CopyOnWriteArraySet<String> set = new CopyOnWriteArraySet<>(); 13 14 private static int capcity = 5; 15 16 //private static HashSet<String> set =new HashSet<>(); 17 public static void main(String[] args) { 18 CopyOnWriteArraySetTest.InnerThread t1 = new InnerThread(); 19 CopyOnWriteArraySetTest.InnerThread t2 = new InnerThread(); 20 t1.start(); 21 t2.start(); 22 try { 23 Thread.sleep(1000); 24 log.info("collection:{} ",set.toString()); 25 26 } catch (InterruptedException e) { 27 e.printStackTrace(); 28 } 29 30 31 } 32 33 static class InnerThread extends Thread { 34 @Override 35 public void run() { 36 for (int i = 0; i < capcity; i++) { 37 set.add(String.valueOf(i)); 38 set.add(String.valueOf(i)); 39 iterator(set); 40 } 41 } 42 } 43 44 public static void iterator(Set set) { 45 Iterator iterator = set.iterator(); 46 while (iterator.hasNext()) { 47 iterator.next(); 48 } 49 50 } 51} 52
结果
21:10:09.967 [main] INFO javalearn.javabase.concurrent.CopyOnWriteArraySetTest - collection:[0, 1, 2, 3, 4]