文章目录

  • 多线程环境下使用ArrayList
    • Collections.synchronizedList
    • CopyOnWriteArrayList(写时拷贝)
  • 多线程下使用HashMap
  • 多线程下使用队列

我们常见的一些集合类,

  • ArrayList
  • LinkedList
  • TreeMap
  • HashSet
  • TreeSet
  • Queue等

都是线程不安全的,不过除了这些线程不安全的集合外,Java集合中还是存在一些安全的集合类的,Vector,Stack,HashTable 都是线程安全的集合类,虽然这三个类是线程安全的,但并不建议使用,像 Vector和HashTable 都已经被官方标注成“即将废弃”。这些线程安全的集合类,它们的操作都是通过 Synchronized来保证线程安全的。

多线程环境下使用ArrayList

我们前面说了ArrayList是线程不安全的,如果要在多线程的情况下使用ArrayList怎么使用呢?

  1. 自己使用Synchronized或者ReentrantLock进行加锁

Collections.synchronizedList

synchronizedList 是标准库提供的一个基于 synchronized 进行线程同步的 List

synchronizedList 的关键操作上都带有 synchronized (add,get,remove 等)

List<Integer> list = Collections.synchronized(new ArrayList<Integrr>())

CopyOnWriteArrayList(写时拷贝)

如果只有一个线程写,此时就只有一份实例,如果又来了一个线程写数据,此时就会在原先的基础之上,搞一个新副本。

List<Integer> list = new CopyOnWriteArrayList<>();

多线程下使用HashMap

ConcurrentHashMap<Integer,Integer> map = new ConcurrentHashMap<>();

ConcurrentHashMap是针对每个哈希桶来进行加锁的

多线程下使用队列

JDK中提供了很多种阻塞队列,不过我们常见的就是 LinkedBlockingDeque 和 PriorityBlockingQueue(带阻塞功能的优先级队列)
LinkedBlockingDeque是一个用链表实现的有界阻塞队列,此队列的默认和最大长度为 Integer.MAX_VALUE。此队列遵循先进先出的原则。
阻塞队列中提供了 put和tack方法,这两个方法是带有阻塞功能的。

  • put 方法用来入队列,如果队列满了,将阻塞直到有空间可用为止才继续入队列
  • take 方法用来出队列,如果队列为空,就会处于阻塞到队列中有元素才会开始出队列
  • BlockingQueue 也有 offer, poll, peek 等方法, 但是这些方法不带有阻塞特性
        LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();

通过阻塞队列就可以实现生产者消费者模型

Java中那些线程安全的集合类相关推荐

  1. Java中的线程基础知识

    Java中的线程基础知识 1.线程概念 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个 ...

  2. java中的线程安全是什么?

    java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问. 什么 ...

  3. 关于Java中的线程安全(线程同步)

    java中的线程安全是什么:就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫线 ...

  4. 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  5. Java 中的线程安全的类

    Java 中的线程安全的类 3 个线程安全的类 它们对应的非线程安全的类 它们延伸的类 其它 它们对应的非线程安全的类 3 个线程安全的类   Java 中的 3 个基本的线程安全的类为:Hashta ...

  6. 不允许使用java方式启动_细品 Java 中启动线程的正确和错误方式

    细品 Java 中启动线程的正确和错误方式 前文回顾详细分析 Java 中实现多线程的方法有几种?(从本质上出发) start 方法和 run 方法的比较 代码演示:/** * * start() 和 ...

  7. 如何在java中实现线程_用代码说话:如何在Java中实现线程

    并发编程是Java语言的重要特性之一,"如何在Java中实现线程"是学习并发编程的入门知识,也是Java工程师面试必备的基础知识.本文从线程说起,然后用代码说明如何在Java中实现 ...

  8. Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。...

    java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待) ...

  9. 万字图文 | 学会Java中的线程池,这一篇也许就够了!

    来源:一枝花算不算浪漫 线程池原理思维导图.png 前言 Java中的线程池已经不是什么神秘的技术了,相信在看的读者在项目中也都有使用过.关于线程池的文章也是数不胜数,我们站在巨人的肩膀上来再次梳理一 ...

最新文章

  1. opencv 调整窗口大小_opencv改变imshow窗口大小,窗口位置的方法
  2. 图片浏览器每次只能打开一张图片_导出阿里国际站图片银行中的图片到电脑
  3. 算法与数据结构 (三) 二叉树的简单应用 二叉查找树,二叉堆排序
  4. 【kafka】kafka 零拷贝 技术
  5. dudu: 图片显示错误问题,望更正
  6. 转:vs2012远程调试功能的改进
  7. ChinaITLab-Linux工程师培训课程笔记2
  8. Docker端口映射后外部无法访问现象排查
  9. 外资餐饮连锁或因产品质量影响销售额
  10. java如何做网页_java怎么做一个简单网页?网页包括什么?
  11. 怎么查询计算机二级证书快递号,计算机二级office查询成绩后的注意事项证书直邮申请17到到23号...
  12. python爬虫网易云音乐评论最多的歌_Python3实战之爬虫抓取网易云音乐的热门评论...
  13. 解析DELLR710服务器迁移操作内容
  14. 数据结构之数据指标对比(Performance Measurement)
  15. 冲量在线要做数据流通基础设施服务商
  16. 基础算法一:大整数模积运算
  17. vue项目该不该使用eslint验证?
  18. 全球最大的已泄漏密码库现可公开访问下载:你的密码有人泄漏过吗?
  19. 排球计分系统java_排球计分系统|网世技术排球计分系统下载v1.0官方版 - 欧普软件下载...
  20. 国内外的免费AI作图工具

热门文章

  1. 教你6个步骤,快速找到自己需要的光纤跳线
  2. Laravel5.8入门系列二,快速实现用户注册登录功能
  3. 如何把网吧计算机放到桌面,普通电脑如何实现网吧锁屏?让你的电脑实现网吧挂机锁功能的方法...
  4. 转行软件测试2年了,给还在犹豫的女生一点建议
  5. 计算机二级ms office考试知识点,2020年全国计算机二级MS Office复习知识点:考试内容要求...
  6. JS生成二维码以及点击下载二维码
  7. 基于HTML5的APP开发学习(一)
  8. PPT母版如何使用?
  9. 浅析时序数据库评测和选型
  10. JDK各个版本发布时间和版本名称