多线程---线程安全的集合类

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


我们原先学习过的集合类,大部分都是线程不安全的。只有Vector、Stack、HashTable是线程安全的,但是也不推荐使用。通常情况下,我们都会使用下面介绍的这几种数据结构来保证多线程中的线程安全。

多线程环境使用数组

synchronizedList

synchronizedList是通过对list的每个操作都加上synchronized来保证线程安全的。

        List list = Collections.synchronizedList(new ArrayList<>());

CopyOnWriteArrayList

CopyOnwrite:写时拷贝。它不加锁就能保证线程安全,采用“双缓冲区机制”。但是适用的场景有限:通常用在写的频率比较低的场景,如一写多读。

多线程---线程安全的集合类,JavaEE初阶,安全,java

注: 当数据量非常大的时候,拷贝数据的消耗非常大,就不适合使用这样的方式了。

多线程环境使用队列

在多线程环境下我们都是借助阻塞队列来保证线程安全,但是又可以分为以下几种类型:

        //普通的阻塞队列
		BlockingQueue<Integer> blockingQueue = new LinkedBlockingDeque<>();
		//基于数组实现的阻塞队列
        ArrayBlockingQueue<Integer> arrayBlockingQueue = new ArrayBlockingQueue<Integer>(10);
        //基于链表实现的阻塞队列
        LinkedBlockingDeque<Integer> linkedBlockingDeque = new LinkedBlockingDeque<>();
        //带有优先级的阻塞队列
        PriorityBlockingQueue<Integer> priorityBlockingQueue = new PriorityBlockingQueue<>();

        //最多只包含一个元素的阻塞队列
        TransferQueue<Integer> transferQueue = new LinkedTransferQueue<>();

多线程环境使用哈希表

HashTable

不推荐使用。它虽然能够保证线程安全,但是使用的方法是:无脑的给每个方法都加上synchronized。代码的执行效率并不高。

ConcurrentHashMap

ConcurrentHashMap背后做了非常多的优化使其在多线程环境下非常好用

  1. 优化锁粒度的控制

多线程---线程安全的集合类,JavaEE初阶,安全,java

  • HashTable直接在方法上加锁,相当于是对this加锁。所有对HashTable的操作都会造成锁竞争,锁冲突的概率很大。
  • ConcurrentHashMap是分别对每个哈希桶加锁,即加了多把锁,这个就极大程度的减小了锁冲突的概率。
  1. ConcurrentHashMap只对写操作加锁,不对读操作加锁

    它这样做的时候会有以下几种情况:

    • 两个线程同时读—没有锁冲突
    • 两个线程同时写—有锁冲突
    • 一个线程读、一个线程写呢?—也没有锁冲突
      这样会不会线程不安全呢?即读到一个修改了一半的值。其实是不会的,ConcurrentHashMap在设计的时候就保证了读到的数据一定是一个完整的数据(要么是旧版本,要么是新版本);另外它还会广泛的使用到volatile来保证内存可见性,进而保证线程安全。
  2. 充分利用到了CAS特性

  • ConcurrentHashMap的思路就是能不加锁就不加锁,加锁毕竟是有开销的。它就广泛的应用了CAS的特性,比如维护元素个数。在加锁时也会使用基于CAS实现的轻量级锁。
  1. 优化了ConcurrentHashMap的扩容操作

多线程---线程安全的集合类,JavaEE初阶,安全,java
多线程---线程安全的集合类,JavaEE初阶,安全,java文章来源地址https://www.toymoban.com/news/detail-735827.html

HashTable VS HashMap VS ConcurrentHashMap

  1. HashMap是线程不安全的,HashTable和ConcurrentHashMap是线程安全的。
  2. HashMap的key值可以为null,HashTable和ConcurrentHashMap的key值不能为null
  3. ConcurrentHashMap相对于HashTable的四大优化

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

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

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

相关文章

  • 【JavaEE】线程安全的集合类

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

    2024年01月20日
    浏览(39)
  • JavaEE初阶:Java线程的状态

    目录 获取当前线程引用 休眠当前线程  线程的状态 1.NEW               2.TERMINATED  3.RUNNABLE 4.WAITING 5.TIMED_WAITING 6.BLOCKED 多线程的意义 单线程  多线程 这个方法返回当前线程的引用。但是我们会对static有疑惑,这其实是一个静态方法,更好的说法是这是一个 类方法, 调用这

    2024年02月11日
    浏览(39)
  • JavaEE 初阶篇-深入了解多线程安全问题(指令重排序、解决内存可见性与等待通知机制)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         1.0 指令重排序概述         1.1 指令重排序主要分为两种类型         1.2 指令重排序所引发的问题         2.0 内存可见性概述         2.1 导致内存可见性问题主要涉及两个方面      

    2024年04月15日
    浏览(45)
  • javaee初阶———多线程(三)

    T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 小比特 大梦想 此篇文章与大家分享多线程专题第三篇,关于 线程安全 方面的内容 如果有不足的或者错误的请您指出! 我们在前面说过,线程之间是抢占式执行的,这样产生的随机性,使得程序的执行顺序变得不一致,就会使得程序产生不同的结

    2024年04月16日
    浏览(38)
  • JavaEE初阶:多线程 - 编程

    我们在之前认识了什么是多进程,今天我们来了解线程。 一个线程就是一个 \\\"执行流\\\". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 \\\"同时\\\" 执行 着多份代码. 引入 进程 这个概念,主要是为了解决并发编程这样的问题。因为cpu进入了多核心的时代,要想进一步

    2024年02月12日
    浏览(34)
  • Java 多线程之线程安全集合

    集合关系图 本文主要关注线程安全的集合,如 List、Set、Queue、Map 等接口的线程安全的实现方式,有关集合基础知识请转到这里。所谓线程安全集合,就是在多线程环境中使用集合不会导致数据不一致和数据异常的集合。在 Java 中线程安全集现在基本都使用 java.util.concurrent

    2024年02月05日
    浏览(48)
  • 【JavaEE初阶】 线程池详解与实现

    线程池,是一种线程的使用模式,它为了降低线程使用中频繁的创建和销毁所带来的资源消耗与代价。 通过创建一定数量的线程,让他们时刻准备就绪等待新任务的到达,而任务执行结束之后再重新回来继续待命。 想象这么一个场景: 在学校附近新开了一家快递店,老板很

    2024年02月06日
    浏览(35)
  • 【JavaEE初阶】线程的概念与创建

    本节目标 认识多线程 创建多线程 Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。 一个线程就是一个 “执行流” . 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之

    2024年02月07日
    浏览(37)
  • 多线程(JavaEE初阶系列7)

    目录 前言: 1.常见的锁策略 1.1乐观锁和悲观锁 1.2轻量级锁和重量级锁 1.3自旋锁和挂起等待锁 1.4互斥锁与读写锁 1.5可重入锁与不可重入锁 1.6公平锁与非公平锁 2.CAS 2.1什么是CAS 2.2自旋锁的实现 2.3原子类 3.synchronized 3.1synchronized的原理以及基本特点 3.2偏向锁 3.3轻量级锁 3.4重

    2024年02月14日
    浏览(32)
  • 多线程(JavaEE初阶系列4)

    目录 前言: 1.单例模式 1.1饿汉模式 1.2懒汉模式 1.3结合线程安全下的单例模式 1.4单例模式总结 2.阻塞式队列 2.1什么是阻塞队列 2.2生产者消费者模型 2.2.1 上下游模块之间进行“解耦合” 2.2.2削峰填谷 2.3阻塞队列的实现 结束语: 在上节中小编主要与大家分享了多线程中遇到

    2024年02月15日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包