来源:blog.csdn.net/li_canhui/article/details/91393247在多线程环境下,应该使用线程安全的集合。例如ConcurrentHashMap是线程安全的HashMap,CopyOnWriteArrayList是线程安全的ArrayList。那么HashSet对应的线程安全集合是什么呢?java是否提供默认实现?在java的concurrent包中,我找到了CopyOnWriteArraySet,那么它是线程安全的吗?下面是测试代码。publicstaticvoidmain(String[]args){Setset=newCopyOnWriteArraySet<>();ExecutorService服务=Executors.newFixedThreadPool(12);整数倍=10000;AtomicInteger标志=newAtomicInteger(0);for(inti=0;i{set.add("a"+flag.getAndAdd(1));});}service.shutdown();尝试{service.awaitTermination(Long.MAX_VALUE,TimeUnit.DAYS);}catch(Exceptione){e.printStackTrace();}System.out.println(set.size());}多次执行后结果为10000,可以说明CopyOnWriteArraySet是一个线程安全的Set。另外,关注公众号Java技术栈,后台回复:面试,可以拿到我整理的Java系列面试题及答案,很全。那么CopyOnWriteArraySet在写入时是如何保证线程安全的呢?下面是CopyOnWriteArraySet的添加源码。publicbooleanadd(Ee){returnal.addIfAbsent(e);}publicbooleanaddIfAbsent(Ee){Object[]snapshot=getArray();返回indexOf(e,snapshot,0,snapshot.length)>=0?false:addIfAbsent(e,snapshot);}privatestaticintindexOf(Objecto,Object[]elements,intindex,intfence){如果(o==null){for(inti=index;i=0)返回false;}Object[]newElements=Arrays.copyOf(current,len+1);新元素[len]=e;设置数组(新元素);返回真;}最后{lock.unlock();}}从源码可以看出,CopyOnWriteArraySet底层使用CopyOnWriteArrayList数据结构实现了在添加元素时,使用可重入锁来实现线程安全。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!