欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java并发时HashSet报错ConcurrentModificationException解决方案

程序员文章站 2022-04-15 17:57:08
HashSetHashSet特点: 元素不可重复,无序,线程不安全,底层是HashMap实现,HashMap的key是唯一不可重复的,value则是用的一个Object对象"占位",主要是key用来存取数据.案例代码public class HashSetConcurrentDemo { public static void main(String[] args) { Set list = new HashSet(); for...

HashSet

HashSet特点: 元素不可重复,无序,线程不安全,底层是HashMap实现,HashMap的key是唯一不可重复的,value则是用的一个Object对象"占位",主要是key用来存取数据.

案例代码

public class HashSetConcurrentDemo { public static void main(String[] args) { Set<String> list = new HashSet(); for (int i = 0; i < 30 ; i++) { new Thread(()->{ list.add(UUID.randomUUID().toString().substring(0,8)); System.out.println(list); },"t"+i).start(); } } } 

导致原因

高并发情况下,多个线程调用add方法产生的错误.
Java并发时HashSet报错ConcurrentModificationException解决方案

解决方案

  1. Collections.synchronizedSet(new HashSet<>())集合工具类
    底层是同步代码块synchronized来保证线程安全,其实就是把HashSet方法加了同步代码块,底层操作还是细节没变,就是包装了一层,加上了synchronized修饰保证线程安全
    Java并发时HashSet报错ConcurrentModificationException解决方案
    关键代码
    Java并发时HashSet报错ConcurrentModificationException解决方案
  2. CopyOnWriteArraySet
    CopyOnWriteArraySet其实底层是CopyOnWriteArrayList,也是采用ReentrantLock锁来保证线程安全.
    每次添加元素都会遍历集合中元素是否存在,存在返回元素所在下标,如果下标大于-1则跳出方法返回false,否则执行添加元素的操作Java并发时HashSet报错ConcurrentModificationException解决方案

本文地址:https://blog.csdn.net/weixin_37961431/article/details/107893404

相关标签: Java 多线程