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。
