1、示例

  1. public class ContainerNotSafeDemo {
  2. public static void main(String[] args) {
  3. Set<String> set = new HashSet<>();
  4. for (int i = 1; i <= 20; i++) {
  5. new Thread(() -> {
  6. set.add(UUID.randomUUID().toString().substring(0,8));
  7. System.out.println(set);
  8. },String.valueOf(i)).start();
  9. }
  10. }
  11. }

运行会有java.util.ConcurrentModificationException,并发修改异常。

2、解决方案

类似于ArrayList,有一下解决方案:

  • 使用Collections工具类的Collections.synchronizedSet(Set set)方法;

    1. Set<String> set = Collections.synchronizedSet(new HashSet<>());
  • 使用JU包下的CopyOnWriteArraySet;

    1. Set<String> set = new CopyOnWriteArraySet<>();

CopyOnWriteArraySet实质上,底层还是CopyOnWriteArrayList。