线程安全的集合类

这篇具有很好参考价值的文章主要介绍了线程安全的集合类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

我会简单的介绍一些线程安全的集合类,还有它们的基本构成,大家请不要安心难度的问题,现在只是简单的了解一下.为什么要涉及线程安全的集合类呢?因为假如说我们要在多线程环境下使用,怎么办?这里提供了俩种方案.
1.最直接的办法,使用锁,手动保证~
多个线程去修改ArrayList 此时就可能有问题就可以给修改操作进行加锁~~
2.标准库还提供了一些线程安全的版本的集合类

多线程环境使用 ArrayList

在多线程环境中,使用 ArrayList 可能会引发线程安全问题。因为 ArrayList 并不是线程安全的容器,多个线程同时修改同一个 ArrayList 实例可能会导致数据不一致或者抛出异常。
如果非要使用的话,我提供了以下解决方案

  1. 自己使用同步机制 (synchronized 或者 ReentrantLock)
  2. Collections.synchronizedList(new ArrayList);

synchronizedList 是标准库提供的一个基于 synchronized 进行线程同步的 List.
synchronizedList 的关键操作上都带有 synchronized

  1. 使用 CopyOnWriteArrayList
    CopyOnWrite容器即写时复制的容器。

当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,
复制出一个新的容器,然后新的容器里添加元素,
添加完元素之后,再将原容器的引用指向新的容器。
这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会
添加任何元素。
所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

优点:
在读多写少的场景下, 性能很高, 不需要加锁竞争.
缺点:

  1. 占用内存较多.
  2. 新写的数据不能被第一时间读取到.

多线程环境使用队列

在多线程环境中,使用队列是非常常见的场景,但是需要注意队列的线程安全问题。以下是几种线程安全的队列:

ConcurrentLinkedQueue:这是一个线程安全的无界队列,内部使用单向链表实现,适合于高并发场景;
LinkedBlockingQueue:这是一个线程安全的有界队列,内部使用单向链表实现,适合于固定大小的任务队列;
ArrayBlockingQueue:这是一个线程安全的有界队列,内部使用数组实现,适合于固定大小的任务队列;
PriorityBlockingQueue:这是一个线程安全的优先级队列,内部使用堆实现,适合于按优先级排序的任务队列;
SynchronousQueue:这是一个线程安全的队列,没有任何内部容量,每个插入操作必须等待一个相应的删除操作,适合于生产者和消费者交替执行的场景。
以上队列都是线程安全的,能够在多线程环境中提供高效的并发操作。需要根据实际场景选择适合的队列类型,并根据具体需求设置容量、优先级等参数。

线程环境使用哈希表

ConcurrentHashMap:这是一个线程安全的哈希表,适合于高并发场景,内部采用分段锁机制,不同的段之间可以并发操作,能够提供更好的并发性能;

Hashtable:这是一个线程安全的哈希表,内部使用 synchronized 关键字来实现线程安全,但是并发性能不如 ConcurrentHashMap;

Collections.synchronizedMap():这是一个将非线程安全的哈希表转换为线程安全的哈希表的方法,内部使用 synchronized 关键字来实现线程安全,但是并发性能不如 ConcurrentHashMap。
以上哈希表都是线程安全的,能够在多线程环境中提供高效的并发操作。需要根据实际场景选择适合的哈希表类型,并根据具体需求设置容量、并发性能等参数。


当然我推荐使用ConcurrentHashMap,为什么呢?我们来看一下

Hashtable和 ConcurrentHashMap的对比.

1.锁的粒度不同

Hashtable
线程安全的集合类
ConcurrentHashMap
线程安全的集合类

2.锁的优化

ConcurrentHashMap,更充分的利用了CAS机制无锁编程.
有的操作,比如获取/更新元素个数,就可以直接使用CAS完成,不必加锁了
CAS也能保证线程安全,往往比锁更高效,但是这个东西咱们也不会特别经常使用.适用范围不像锁那么广泛

3.扩容方式不同

扩容触发条件:Hashtable 的扩容触发条件是当哈希表中元素个数大于等于阈值时,就需要进行扩容,阈值是容量 * 负载因子,负载因子默认为 0.75;ConcurrentHashMap 的扩容触发条件是当某个段的元素个数大于等于段容量的 75% 时,就需要对该段进行扩容。

扩容策略:HashTable的扩容需要重新申请内存空间,搬运元素(把元素从旧的哈希表上删掉,插入到新的哈希表上.)如果本身元素特别多,上亿个,搬运一次,成本就很高,就会导致这一次put操作就非常卡顿
ConcurrentHashMap的扩容策略就是,化整为零,并不会试图一次性就把所有的元素都搬运过去,而是每次搬运一部分.当put触发扩容,此时就会直接创建更大的内存空间,但不会直接把所有元素搬运过去,而是搬运一小部分.文章来源地址https://www.toymoban.com/news/detail-411050.html

到了这里,关于线程安全的集合类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安全线程的集合

    方法推荐1.先会用2.货比三家,寻找其他解决方案 3.看源码  CopyOnWriteArrayList 是 Java 中的一个线程安全的集合类,它的设计目的是在读操作非常频繁,而写操作相对较少的情况下提供高效的并发访问。 CopyOnWriteArrayList 使用写入时复制(Copy-On-Write)的机制来实现线程安全。当有

    2024年02月07日
    浏览(20)
  • 面试:线程安全的集合

    线程安全的集合: 线程安全的集合有Vector、HashTable、Stack、ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue等。 1、Vector相当于 ArrayList 的翻版,是长度可变的数组,Vector的每个方法都加了 synchronized 修饰符,是线程安全的。 2、Hashtable是一个线程安全的集合,是单线程集合,它

    2023年04月26日
    浏览(26)
  • 系列六、多线程集合不安全

    2024年02月04日
    浏览(22)
  • 【JavaEE】线程安全的集合类

    作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:《MySQL》《C语言》

    2024年01月20日
    浏览(39)
  • .NET 5种线程安全集合

    在.NET中,有许多种线程安全的集合类,下面介绍五种我们常用的线程安全集合以及他们的基本用法。 ConcurrentBag ConcurrentBag 是一个线程安全的无序包。它适用于在多线程环境中频繁添加和移除元素的情况。 ConcurrentQueue ConcurrentQueue 是一个线程安全的无序队列。它适用于在多

    2024年04月10日
    浏览(36)
  • Java 8并发集合:安全高效的多线程集合

    在多线程环境中,使用线程安全的数据结构非常重要,以避免竞态条件和数据不一致的问题。Java 8引入了一些并发集合类,提供了安全高效的多线程集合操作。本教程将介绍Java 8中的并发集合类,包括ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentSkipListSet和CopyOnWriteArrayList。 Conc

    2024年02月04日
    浏览(52)
  • 【JavaEE初阶】 线程安全的集合类

    原来的集合类, 大部分都不是线程安全的. Vector, Stack, HashTable, 是线程安全的(不建议用), 其他的集合类不是线程安全的. 为什么不建议使用呢? 因为我们在使用的时候,这些类就会自动的加锁,虽然编译器会自动优化为没有锁竞争的线程进行锁消除的优化,但是呢万一编译器没

    2024年02月08日
    浏览(33)
  • 从零学Java 线程安全的集合

    Collection体系集合、以及线程安全集合。 注:下划线代表线程安全集合 Collections中的工具方法 Collections工具类中提供了多个可以获得线程安全集合的方法。 public static Collection synchronizedCollection(Collection c) public static List synchronizedList(List list) public static Set synchronizedSet(Set s) public

    2024年01月17日
    浏览(32)
  • 【JAVA】哪些集合类是线程安全的

    🍎 个人博客: 个人主页 🏆 个人专栏: JAVA ⛳️   功不唐捐,玉汝于成 目录 前言 正文 Vector: HashTable: Collections.synchronizedList()、Collections.synchronizedSet()、Collections.synchronizedMap(): 4.ConcurrentHashMap: 5.CopyOnWriteArrayList 和 CopyOnWriteArraySet: 结语  我的其他博客 在多线程编程中

    2024年01月25日
    浏览(36)
  • javaEE初阶——多线程(九)——JUC常见的类以及线程安全的集合类

    T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享多线程专题的最后一篇文章:关于JUC常见的类以及线程安全的集合类 如果有不足的或者错误的请您指出! 3.1Callable接口 Callable和Runnable一样,都是用来描述一个任务的 但是区别在于 ,用Callable描述的任务是有

    2024年04月25日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包