1、示例
public class ContainerNotSafeDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
for (int i = 1; i <= 20; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
运行会有java.util.ConcurrentModificationException,并发修改异常。
2、解决方案
类似于ArrayList,有一下解决方案:
使用Collections工具类的Collections.synchronizedSet(Set
set)方法; Set<String> set = Collections.synchronizedSet(new HashSet<>());
使用JU包下的CopyOnWriteArraySet;
Set<String> set = new CopyOnWriteArraySet<>();
CopyOnWriteArraySet实质上,底层还是CopyOnWriteArrayList。