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集合相关推荐

  1. Java 创建线程的三种方法比较

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述Java 创建线程的三种方法比较, 更多Java专业知识,广州疯狂jav ...

  2. Java创建线程池的方式

    Java创建线程池的方式 文章目录 Java创建线程池的方式 一.通过Executors工厂方法创建 1.Executors.newSingleThreadExecutor() 2.Executors ...

  3. Java多线程 - Java创建线程的4种方式

    文章目录 1. Java创建线程有哪几种方式? 1.1 线程创建方法一:继承Thread类创建线程类 1.2 线程创建方法二:实现Runnable接口创建线程目标类 1.5 线程创建方法三:使用Cal ...

  4. Java创建线程及配合使用Lambda

    一.创建线程三种方式 1.1 继承Thread类创建线程类 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. 创建Thr ...

  5. java 创建线程的方式

    Java创建线程的方式 1 官方API里面的说法 通过官方 API 可以发现创建线程的方式有两种,第一种是通过继承 Thread 类,重写 run 方法:第二种是通过实现 Runnable 接口,创建 ...

  6. java创建线程(Thread)的5种方式

    java创建线程(Thread)的5种方式 方式一:继承于Thread类 方式二:实现Runnable接口 方式三:实现Callable接口 方式四:使用线程池 方式五:使用匿名类 方式一:继承于Th ...

  7. 想不到吧,Java创建线程的方式只有一种

    目录 前言 继承Thread方式 实现Runnable接口 实现callable接口 总结 前言 看到这个标题的小伙伴先别着急喷我--在面试的时候,我们经常会被问到这种基础题:Java创建线程的方式有 ...

  8. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  9. java 创建线程_java多线程|创建线程的各种方式

    javaDEMO 本网站记录了最全的各种JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~https: ...

最新文章

  1. java获取达梦数据库_Java连接达梦数据库驱动dm_jdbc
  2. virtualbox vm linux 动态获取ip
  3. 十种常用编程语言特点
  4. RPC 和 RESTful
  5. .net core 中 Identity Server 4 Topic 之 Startup
  6. 解决摹客iDoc插件在Sketch中无法正常使用,切图和标注尺寸不一致的问题
  7. flume学习(六):如何使用event header中的key值
  8. 推荐好用的Linux远程连接工具
  9. 【报告分享】 2020-2021智能手机消费趋势与用户忠诚和流失度报告-企鹅智库(附下载)
  10. 一个农村博士的独白:全家为什么只有我读到了博士
  11. inline-block元素高度为0,父级仍被撑起,问题元凶—strut
  12. android 内存至少一半,极客修:为什么iPhone比安卓内存小,却更流畅?
  13. 计算机课板书图片,【教研活动】如何制作动图——计算机专业组
  14. sass基础操作记录
  15. 转:『诡异的』VL10B创建外向交货单出错解决全过程
  16. VRTK插件详解四:部分自带案例分析
  17. 转:北京地铁听证会结束,地铁公交调价方案2胜出,来看看涨价后多了多少钱??...
  18. 电路板设计时的注意事项
  19. 安装snmptraped 和 snmptt
  20. Spyder断点调试

热门文章

  1. 02 知识图谱知识表示与知识建模
  2. @Transactional注解详解
  3. 【测试开发】自动化测试selenium篇(一)
  4. Xavier (2)——刷机
  5. canvas详解04-绘制文字
  6. windows 断网自动重拨
  7. 解决Textlive2021+TeXstudio更新后者出现的部分问题。
  8. Ps大片教程:—失落之城
  9. iTerm 2 Oh My Zsh【DIY教程——亲身体验过程】
  10. Python - 如何像程序员一样思考