java创建线程安全的Set集合
CopyOnWriteArraySet
CopyOnWriteArraySet<String> copyOnWriteArraySet = new CopyOnWriteArraySet<>();
原理
和CopyOnWriteArrayList实现原理一样,采用读写分离的并发策略,读操作的时候不加锁,写操作时创建底层数据的新副本,在新副本上执行写操作,写操作结束后将原引用指向新的容器。适合读多写少的场景。
特点
- 读操作性能高
- 当使用迭代器遍历时,在遍历的间隔中如果修改了集合,不会抛出ConcurrentModificationException异常。
- 由于要复制新副本,会占用较大内存
- 写操作时在新的副本上操作,此时的读操作还是在旧副本上,所以无法保证实时性
- 大量写操作性能很差
Collections.synchronizedSet()
HashSet<String> hashSet = new HashSet<>();
Set<String> synchronizedSet = Collections.synchronizedSet(hashSet);
原理
在原先Set的每一个方法上都加上synchronized关键字
特点
- 性能较差
- 遍历间隔中如果修改了集合,仍会抛出异常ConcurrentModificationExceptions
Collections.newSetFromMap()
Set<String> setFromMap = Collections.newSetFromMap(new ConcurrentHashMap<>());
原理
封装了ConcurrentHashMap,利用ConcurrentHashMap的性质确保生成的Set是线程安全的。
特点
- 该方法必须传入一个空的map
- 性能较好,ConcurrentHashMap是分区的,写操作时对应的分区时是synchronized的,读操作与其他读操作、写操作是完全并发的(但可能没法看到当前正在写入的更改的结果)
- 迭代器创建后可能会看到变化,也可能看不到变化,而且批量操作不是原子操作
- reSize操作较慢,因此在初始化时最好能够指定大小(3/4满时就会reSize)
- 需要hashCode()方法有较好的性能
- 不允许再和传入的map做交互
ConcurrentHashMap.newKeySet()
ConcurrentHashMap.KeySetView<String, Boolean> keySetView = ConcurrentHashMap.newKeySet();
原理
jdk1.8以后引入的特性,是ConcurrentHashMap的特性的一部分
特点
- 与上面提到的Collections.newSetFromMap(new ConcurrentHashMap<>())相似
java创建线程安全的Set集合相关推荐
- Java 创建线程的三种方法比较
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...
- Java创建线程池的方式
Java创建线程池的方式 文章目录 Java创建线程池的方式 一.通过Executors工厂方法创建 1.Executors.newSingleThreadExecutor() 2.Executors ...
- Java多线程 - Java创建线程的4种方式
文章目录 1. Java创建线程有哪几种方式? 1.1 线程创建方法一:继承Thread类创建线程类 1.2 线程创建方法二:实现Runnable接口创建线程目标类 1.5 线程创建方法三:使用Cal ...
- Java创建线程及配合使用Lambda
一.创建线程三种方式 1.1 继承Thread类创建线程类 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. 创建Thr ...
- java 创建线程的方式
Java创建线程的方式 1 官方API里面的说法 通过官方 API 可以发现创建线程的方式有两种,第一种是通过继承 Thread 类,重写 run 方法:第二种是通过实现 Runnable 接口,创建 ...
- java创建线程(Thread)的5种方式
java创建线程(Thread)的5种方式 方式一:继承于Thread类 方式二:实现Runnable接口 方式三:实现Callable接口 方式四:使用线程池 方式五:使用匿名类 方式一:继承于Th ...
- 想不到吧,Java创建线程的方式只有一种
目录 前言 继承Thread方式 实现Runnable接口 实现callable接口 总结 前言 看到这个标题的小伙伴先别着急喷我--在面试的时候,我们经常会被问到这种基础题:Java创建线程的方式有 ...
- java 创建线程_【80期】说出Java创建线程的三种方式及对比
点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...
- java 创建线程_java多线程|创建线程的各种方式
javaDEMO 本网站记录了最全的各种JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~https: ...
最新文章
- java获取达梦数据库_Java连接达梦数据库驱动dm_jdbc
- virtualbox vm linux 动态获取ip
- 十种常用编程语言特点
- RPC 和 RESTful
- .net core 中 Identity Server 4 Topic 之 Startup
- 解决摹客iDoc插件在Sketch中无法正常使用,切图和标注尺寸不一致的问题
- flume学习(六):如何使用event header中的key值
- 推荐好用的Linux远程连接工具
- 【报告分享】 2020-2021智能手机消费趋势与用户忠诚和流失度报告-企鹅智库(附下载)
- 一个农村博士的独白:全家为什么只有我读到了博士
- inline-block元素高度为0,父级仍被撑起,问题元凶—strut
- android 内存至少一半,极客修:为什么iPhone比安卓内存小,却更流畅?
- 计算机课板书图片,【教研活动】如何制作动图——计算机专业组
- sass基础操作记录
- 转:『诡异的』VL10B创建外向交货单出错解决全过程
- VRTK插件详解四:部分自带案例分析
- 转:北京地铁听证会结束,地铁公交调价方案2胜出,来看看涨价后多了多少钱??...
- 电路板设计时的注意事项
- 安装snmptraped 和 snmptt
- Spyder断点调试