线程安全的集合类

目录

一、线程安全的集合类

1.1、多线程环境下使用ArrayList

1.2、多线程使用队列

1.3、多线程环境使用哈希表

1.3.1、Hashtable 

 1.3.2、ConcurrentHashMap


一、线程安全的集合类

在多线程的环境下,多个线程对同一个共享变量进行写操作的时候,有可能出现线程安全问题。

原来的集合类,大部分都是线程不安全的。

Vetor,Stack,HashStack,是线程安全的但是已经不推荐使用了,其它集合类不是线程安全的。

1.1、多线程环境下使用ArrayList

(1)、自己手动加锁(synchronized或ReentrantLock)

这里不太理解的,可以看之前的博客详解这块的内容

(2)、collections.synchronizedList(new ArrayList)

(3)、使用JUC包中提供的集合类(CopyOnWrite)

CopyOnWrite写时拷贝技术(多线程环境下强烈推荐使用JUC包下的类)

  • 当我们往一个容器中添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy复制出一个新的容器,然后在新的容器中添加元素。
  • 添加完元素之后,再将原容器的引用指向新的容器。

 这样做的好处就是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。

优点:

在读多写少的环境下,大量运用了CAS操作,性能很高(纯用户态操作),不需要进行加锁。

缺点:

  1. 占用内存较多,因为每次写的时候都要去创建一个副本,对内存空间消耗比较大。
  2. 新写的数据不能被第一时间读取到。

1.2、多线程使用队列

1、ArrayBlockingQueue 

基于数组实现的阻塞队列 

2、LinkedBlockingQueue

基于链表实现的阻塞队列 

3、PriorityBlockingQueue

基于堆实现的带优先级的阻塞队列 

4、TransferQueue

 最多只包含一个元素的阻塞队列

1.3、多线程环境使用哈希表

HashMap本身不是线程安全的,在多线程环境下使用哈希表可以使用:

  • HashTable
  • ConcurrentHashMap 

1.3.1、Hashtable 

  • 如果多线程访问同一个Hashtable就会直接造成锁冲突。
  • size属性也是通过synchronized来控制同步的,也是比较慢的。
  • 一旦触发扩容,就由该线程完成整个扩容过程,这个过程会涉及到大量的元素拷贝,效率非常低。(所以强烈不推荐使用)

HashMap和Hashtable是如何组织数据的?底层的数据结构是什么?

*HashMap实现原理 

 *Hashtable实现原理 

 ​​

 1.3.2、ConcurrentHashMap

相比于Hashtable做了一系列优化和改进。(更推荐使用)

  1. 读操作没有加锁(但是使用了volatile来保证内存可见性),只对写操作进行加锁,加锁的方式仍然是用synchronized,但是不是锁整个对象,而是锁“” (用每个链表的头节点作为锁对象),大大降低了锁冲突的概率.
  2. 充分利用了CAS特性,比如size属性通过CAS来更新,避免出现重量级锁的情况.
  3. 优化了扩容方式:化整为零     
    *发现需要扩容的线程,只需要创建一个新的数组,同时只搬去几个元素过去。              *扩容期间,新老数组同时在。                                                                                          *后续每个来操作ConcurretnHashMap的线程,都会参与搬家过程,每个操作负责搬运一小部分元素。                                                                                                                *搬完最后一个元素再把老数组删除。                                                                              *这个期间,插入只往新数组中添加。                                                                              *这个期间,查找需要同时查找新老数组元素。

ConcurrentHashMap每个哈希桶都有一把锁,只有两个线程去访问的恰好是同一个哈希桶上的数据才会发生锁冲突。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4801.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatGPT流式回复是怎么实现的

chatGPT流式回复是怎么实现的 先说结论: chatGPT的流式回复用的就是HTTP请求方案中的server-send-event流式接口,也就是服务端向客户端推流数据。 那eventStream流式接口怎么实现呢,下面就进入正题! 文章目录 chatGPT流式回复…

【NVIDIA】Jetson AGX Orin内核、设备树更新指南

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

redis-单节点安装

daemonize yes port 6379 bind 0.0.0.0 requirepass 123456 save 3600 1 300 100 60 10000dir /usr/local/redis dbfilename dump.rdb logfile redis.log pidfile redis.pid##save 3600 1 300 100 60 10000 ##3600秒(一小时),至少有一个值的话,会进行存盘 ##300秒(五分钟),至少…

Java版企业工程项目管理系统源码+java版本+项目模块功能清单+spring cloud +spring boot

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…

macOS上下载安装Kibana并连接ES

下载Kibana 执行以下命令进行,版本号根据你所用的ES版本选择,比如我的是7.10.0 curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.10.0-darwin-x86_64.tar.gz解压安装Kibana tar -zxvf kibana-7.10.0-darwin-x86_64.tar.gz进行config…

Java -- XXL-JOB分布式任务调度平台

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用 xxl是xxl-job的开发者大众点评的【许雪里】名称的拼音开头 官网地址 分布式任务调度平台XXL-JOB 文档地址…

【MySql】C语言连接mysql|图形化工具

文章目录 Connector/C 使用mysql接口介绍Navicat远程连接数据库 Connector/C 使用 说完了mysql的基础,后面我们只关心使用,要使用C语言连接mysql,需要使用mysql官网提供的库,前往官网下载即可。 但是实际上我们并不需要这样去做,…

力扣1768.交替合并字符串(java模拟法)

题目描述: 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 问题分析: 我们可以直…

MySQL MHA高可用集群部署及故障切换

MySQL MHA高可用集群部署及故障切换 一、MHA概述二、MHA的组成三、MHA的特点四、MHA的原理五、搭建MySQLMHA1、所有服务器,关闭系统防火墙和安全机制2、修改 master(192.168.92.11)、Slave1(192.168.92.12)、Slave2&am…

Jmeter(jmeter-plugins插件的安装使用)

目录 一、安装JMter Plugins 二、Custom Thread Groups插件 Stepping Thread Group 元件 Ultimate Thread Group 一、安装JMter Plugins 1、官网下载 JMeter Plugins 的jar包 2. 将下载的jar包复制到 %JMETER_HOME%\lib\ext 目录下 3. 启动 JMeter --> Options -->…

[BJDCTF2020]认真你就输了

题目具有极大的威胁性 打开下发的excel文件,发现报错,文件格式与扩展不匹配,说明文件后缀做了更改 拿去010,根据文件头发现是一个zip压缩文件 成功解压,结果解压出来的文件一个都看不懂,查看了wp得知 刚上来…

Framework - AMS

一、概念 Android10(API29)开始,ActivityTaskManagerService 接管 ActivityManagerService。 二、启动ATMS过程 三、启动APP & 跳转Activity过程 3.1 Activity → ATMS 启动一个 APP 或跳转一个 Activity 都是调用的 startActivity()&a…