Java中那些线程安全的集合类
文章目录
- 多线程环境下使用ArrayList
- Collections.synchronizedList
- CopyOnWriteArrayList(写时拷贝)
- 多线程下使用HashMap
- 多线程下使用队列
我们常见的一些集合类,
- ArrayList
- LinkedList
- TreeMap
- HashSet
- TreeSet
- Queue等
都是线程不安全的,不过除了这些线程不安全的集合外,Java集合中还是存在一些安全的集合类的,Vector,Stack,HashTable 都是线程安全的集合类,虽然这三个类是线程安全的,但并不建议使用,像 Vector和HashTable 都已经被官方标注成“即将废弃”。这些线程安全的集合类,它们的操作都是通过 Synchronized来保证线程安全的。
多线程环境下使用ArrayList
我们前面说了ArrayList是线程不安全的,如果要在多线程的情况下使用ArrayList怎么使用呢?
- 自己使用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中那些线程安全的集合类相关推荐
- Java中的线程基础知识
Java中的线程基础知识 1.线程概念 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个 ...
- java中的线程安全是什么?
java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问. 什么 ...
- 关于Java中的线程安全(线程同步)
java中的线程安全是什么:就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫线 ...
- 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)
@Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...
- Java 中的线程安全的类
Java 中的线程安全的类 3 个线程安全的类 它们对应的非线程安全的类 它们延伸的类 其它 它们对应的非线程安全的类 3 个线程安全的类 Java 中的 3 个基本的线程安全的类为:Hashta ...
- 不允许使用java方式启动_细品 Java 中启动线程的正确和错误方式
细品 Java 中启动线程的正确和错误方式 前文回顾详细分析 Java 中实现多线程的方法有几种?(从本质上出发) start 方法和 run 方法的比较 代码演示:/** * * start() 和 ...
- 如何在java中实现线程_用代码说话:如何在Java中实现线程
并发编程是Java语言的重要特性之一,"如何在Java中实现线程"是学习并发编程的入门知识,也是Java工程师面试必备的基础知识.本文从线程说起,然后用代码说明如何在Java中实现 ...
- Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。...
java中,线程的状态使用一个枚举类型来描述的.这个枚举一共有6个值: NEW(新建).RUNNABLE(运行).BLOCKED(锁池).TIMED_WAITING(定时等待).WAITING(等待) ...
- 万字图文 | 学会Java中的线程池,这一篇也许就够了!
来源:一枝花算不算浪漫 线程池原理思维导图.png 前言 Java中的线程池已经不是什么神秘的技术了,相信在看的读者在项目中也都有使用过.关于线程池的文章也是数不胜数,我们站在巨人的肩膀上来再次梳理一 ...
最新文章
- opencv 调整窗口大小_opencv改变imshow窗口大小,窗口位置的方法
- 图片浏览器每次只能打开一张图片_导出阿里国际站图片银行中的图片到电脑
- 算法与数据结构 (三) 二叉树的简单应用 二叉查找树,二叉堆排序
- 【kafka】kafka 零拷贝 技术
- dudu: 图片显示错误问题,望更正
- 转:vs2012远程调试功能的改进
- ChinaITLab-Linux工程师培训课程笔记2
- Docker端口映射后外部无法访问现象排查
- 外资餐饮连锁或因产品质量影响销售额
- java如何做网页_java怎么做一个简单网页?网页包括什么?
- 怎么查询计算机二级证书快递号,计算机二级office查询成绩后的注意事项证书直邮申请17到到23号...
- python爬虫网易云音乐评论最多的歌_Python3实战之爬虫抓取网易云音乐的热门评论...
- 解析DELLR710服务器迁移操作内容
- 数据结构之数据指标对比(Performance Measurement)
- 冲量在线要做数据流通基础设施服务商
- 基础算法一:大整数模积运算
- vue项目该不该使用eslint验证?
- 全球最大的已泄漏密码库现可公开访问下载:你的密码有人泄漏过吗?
- 排球计分系统java_排球计分系统|网世技术排球计分系统下载v1.0官方版 - 欧普软件下载...
- 国内外的免费AI作图工具
热门文章
- 教你6个步骤,快速找到自己需要的光纤跳线
- Laravel5.8入门系列二,快速实现用户注册登录功能
- 如何把网吧计算机放到桌面,普通电脑如何实现网吧锁屏?让你的电脑实现网吧挂机锁功能的方法...
- 转行软件测试2年了,给还在犹豫的女生一点建议
- 计算机二级ms office考试知识点,2020年全国计算机二级MS Office复习知识点:考试内容要求...
- JS生成二维码以及点击下载二维码
- 基于HTML5的APP开发学习(一)
- PPT母版如何使用?
- 浅析时序数据库评测和选型
- JDK各个版本发布时间和版本名称