集合不安全之 ---> Set
Set 作为一个接口,它的实现类中主要是hashset,在多线程操作set的时候会出现问题,一下为一个列子
public static void main(String[] args) throws Exception { Set<String> set = new HashSet<>(); for (int i = 0;i<30;i++){ new Thread(()->{ set.add(Thread.currentThread().getName()); System.out.println(Thread.currentThread().getName()+"\t"+set); }).start(); } } //运行结果如下:多线程共同修改set集合,造成了并发修改异常 java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445) at java.util.HashMap$KeyIterator.next(HashMap.java:1469) at java.util.AbstractCollection.toString(AbstractCollection.java:461) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:131) at juc.ContainerNotSafeDemo.lambda$main$0(ContainerNotSafeDemo.java:17) at java.lang.Thread.run(Thread.java:748)
解决方案如下:
- - 使用Vector类
- - 使用Collections.synchronizedSet()方法,参数为一个Set对象
- - 使用CopyOnWriteArraySet类
- > CopyOnWriteArraySet类的底层使用了CopyOnWriteArrayList类
CopyOnWriteArraySet的构造器,用的还是写时赋值技术,上篇list写过,这里不再描述
有志者、事竟成,破釜沉舟,百二秦关终属楚;
苦心人、天不负,卧薪尝胆,三千越甲可吞吴.
加油吧,致每个正在奋斗路上的你!!!