多线程环境下优先使用无状态bean(不带属性的类)和不使用共享变量(每一个线程持有自己的变量(threadlocal或者局部变量)),如果在多线程环境下,必须使用共享变量,请参考如下:
import java.util.HashSet;
import java.util.UUID;
public class HashSetNoSafeDemo {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(set);
}, String.valueOf(i)).start();
}
}
/**
*1.故障现象
* java.util.ConcurrentModificationException
* 2.导致原因
* 并发争抢修改导致的
* 3.解决方案
* 3.1 Collections.synchronizedList(new HashSet<>());
* 3.2 new CopyOnWriteArraySet<>()
*
* CopyOnWriteArraySet类持有CopyOnWriteArrayList对象,调用的就是CopyOnWriteArrayList里面的add方法
* public