集合类的线程安全问题

集合类

原来的集合类,大部分都不是线程安全的
Vector, Stack, HashTable, 是线程安全的(不建议用), 其他的集合类不是线程安全的.
加了锁,不一定就是线程安全的,不加锁也不一定是线程不安全的,需要具体问题具体分析
虽然get,set方法都加了synchronized,但是如果不能正确使用,也可能会出现线程安全问题
1.如果是多个线程,并发执行set操作,由于synchronized限制,是线程安全.
2.如果多个线程进行一些复杂的操作,比如先判定get的值是xxxx,再进行set,就出现了一种情况,使得整个逻辑变得不是一个原子级别的任务
即使把这里的get和set分别进行加锁,如果不能正确的使用,也可能产生线程安全问题,而且在单线程的情况下,有可能会因为synchronized影响到执行效率

多线程环境使用 ArrayList

自己使用同步机制 (synchronized 或者 ReentrantLock)

Collections.synchronizedList(new ArrayList);
ArrayList本身没有使用synchronized,但是你又不想自己加锁,就可以使用上面这个方法.,相当于让ArrayList像Vector一样工作

使用 CopyOnWriteArrayList

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

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

多线程环境使用队列

  1. ArrayBlockingQueue
    基于数组实现的阻塞队列
  2. LinkedBlockingQueue
    基于链表实现的阻塞队列
  3. PriorityBlockingQueue
    基于堆实现的带优先级的阻塞队列
  4. TransferQueue
    最多只包含一个元素的阻塞队列

多线程环境使用哈希表

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

Hashtable

只是简单的把关键方法加上了 synchronized 关键字.
这相当于直接针对 Hashtable 对象本身(this)加锁.
如果多线程访问同一个 Hashtable 就会直接造成锁冲突(读也会).
size 属性也是通过 synchronized 来控制同步, 也是比较慢的.
一旦触发扩容, 就由该线程完成整个扩容过程. 这个过程会涉及到大量的元素拷贝, 效率会非常低.

ConcurrentHashMap

相比于 Hashtable 做出了一系列的改进和优化. 以 Java1.8 为例
读操作没有加锁(但是使用了 volatile 保证从内存读取结果), 只对写操作进行加锁. 加锁的方式仍然是是用 synchronized, 但是不是锁整个对象, 而是 “锁桶” (用每个链表的头结点作为锁对象), 大大降低了锁冲突的概率.
充分利用 CAS 特性. 比如 size 属性通过 CAS 来更新. 避免出现重量级锁的情况.
优化了扩容方式: 化整为零
发现需要扩容的线程, 只需要创建一个新的数组, 同时只搬几个元素过去.
扩容期间, 新老数组同时存在.
后续每个来操作 ConcurrentHashMap 的线程, 都会参与搬家的过程. 每个操作负责搬运一小部分元素.
搬完最后一个元素再把老数组删掉.
这个期间, 插入只往新数组加.
这个期间, 查找需要同时查新数组和老数组
在这里插入图片描述
ConcurrentHashMap的每一个哈希桶上都有一把锁,只有当两个线程访问同一个哈希桶的时候才会出现锁冲突

相关面试题

  1. ConcurrentHashMap的读是否要加锁,为什么?
    读操作没有加锁. 目的是为了进一步降低锁冲突的概率. 为了保证读到刚修改的数据, 搭配了
    volatile 关键字.
  2. 介绍下 ConcurrentHashMap的锁分段技术?
    这个是 Java1.7 中采取的技术. Java1.8 中已经不再使用了. 简单的说就是把若干个哈希桶分成一个"段" (Segment), 针对每个段分别加锁.目的也是为了降低锁竞争的概率. 当两个线程访问的数据恰好在同一个段上的时候, 才触发锁竞争.
  3. ConcurrentHashMap在jdk1.8做了哪些优化?
    取消了分段锁, 直接给每个哈希桶(每个链表)分配了一个锁(就是以每个链表的头结点对象作为锁对象).将原来 数组 + 链表 的实现方式改进成 数组 + 链表 / 红黑树 的方式. 当链表较长的时候(大于等于8 个元素)就转换成红黑树
  4. Hashtable和HashMap、ConcurrentHashMap 之间的区别?
    HashMap: 线程不安全. key 允许为 null
    Hashtable: 线程安全. 使用 synchronized 锁 Hashtable 对象, 效率较低. key 不允许为 null.
    ConcurrentHashMap: 线程安全. 使用 synchronized 锁每个链表头结点, 锁冲突概率低, 充分利用CAS 机制. 优化了扩容方式. key 不允许为 null

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机毕业设计】235房屋交易平台

一、系统截图(需要演示视频可以私聊) 摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性…

IDC机房建设方案参考资料

由于计算机设备的集成度越来越高,网络化程度也越来越高,所以信息系统更加依赖于高可靠的网络中心的不间断运行。网络中心的高可靠运行需求,给机房场地环境带来了更高的要求。 网络中心机房建设内容: 机房装修系统 机房布线系统(网…

计算机机房的荷载,​计算机信息中心机房建设标准

原标题:​计算机信息中心机房建设标准 前言 随着信息化的不断推进以及软硬件技术的发展,我们的生活越来越离不开信息技术。而对于信息传递的载体以及传输中心来说,计算机信息中心的建设以及维护是其中至关重要的一环。计算机信息中心机房和设备间(以下统称机房)是放置各种硬…

验房报告(电子版)

原创素材 1、验房报告电子版VS验房报告传统版对比区别 2、验房电子报告版面 好处在哪里?后台会不断升级优化 验房师或验房公司随时随地可以使用,不需要经过密码或授权,做完报告现场直接生成PDF版发给业主即可 3、验房电子报告数据 目前后台…

three - 2 - IT机房案例

代码git地址:https://github.com/buglas/threejs-lesson 知识点 场景 Scene透视相机 PerspectiveCamera基础材质 MeshBasicMaterial几何体 BufferGeometry网格对象 Mesh渲染对象 WebGLRenderer轨道控制器 OrbitControls 项目概述 按理说,学习一门新…

【计算机毕业设计】租房网站

租房网站 在网络高速发展的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,房东只能以用户为导向,所以开发租房网站是必须的。 系统采用了Java技术&#xf…

90分的机房长什么样?(三)

还记得之前雨笋君分享过的《90分的机房长什么样?(一、二)》系列内容吧,本篇继续为大家讲解另外四方面测评标准。 1、防静电 l 机房应铺设防静电地板或地面,并且地板进行安全接地处理。 常见的静电地板包括&#xff1…

机房建设方案设计

按企业规模大小参考《GB_50174-2017数据中心设计规范》,具体文件可以私信我获取

学校旧机房电脑如何改造升级成云教室客户端 旧电脑改造成x86云终端

过去十多年,随着国家信息化不断建设,学校已基本建设了多媒体教室和计算机实验室。但由于信息技术发展速度快,硬件软件更新换代周期变短,许多学校的机器已无法安装部署新的系统和软件,有些勉强能安装也是运行速度很慢。…

【计算机毕业设计】522租房网站

一、系统截图(需要演示视频可以聊) 目 录 摘 要 Abstract 第1章 前 言 2 1.1 研究背景 1.2 研究现状 1.3 系统开发目标 第2章 系统开发环境 2.1 java技术 2.2 Mysql数据库 2.3 B/S结构 2.4 springboot框架 2.5 ECLIPSE 开发…

【机房】机房配置三部曲

【前言】 终于开机房了!OK,打开机房,这是个什么玩意儿!看不懂,关上,再打开,还是看不懂,按照步骤就做吧! 配置文件DSN 打开ODBC数据源,找到文件DSN&#xff…

【计算机毕业设计】022房屋租售网站

一、系统截图(需要演示视频可以私聊) 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针…

【C语言】操作符大全(保姆级介绍)

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 🔥该篇将详细介绍各种操作符的功能。 目录: 📘 前言① 算术操作符②移位操作符③位操作符④赋值操…

魔兽世界·与你同行,一起追忆魔兽年华吧

魔兽十周年纪录片《魔兽世界:寻求组队》 (激动时间长达1小时,建议在WIFI下观看) 2009年7月16日,一网友在WoW百度贴吧发表了一个名为“贾君鹏你妈妈喊你回家吃饭”的帖子,随后短短五六个小时内被390617名网友…

深度学习在自然语言处理中的十大应用领域

文章目录 1. 机器翻译2. 文本分类3. 命名实体识别4. 问答系统5. 文本生成6. 情感分析7. 语言生成与处理8. 信息检索与摘要9. 文本纠错与修复10. 智能对话系统总结 🎉欢迎来到AIGC人工智能专栏~深度学习在自然语言处理中的十大应用领域 ☆* o(≧▽≦)o *☆嗨~我是IT陈…

【前端】使用wow.js这个插件(实现页面动画效果),提高前端开发效率。

1.简介 有的页面在向下滚动的时候,有些元素会产生细小的动画效果。比如需要做到滚动条滑到某个位置时,才能显示动画。 wow.js 依赖 animate.css,所以它支持 animate.css 多达 60 多种的动画效果,能满足您的各种需求。 2.兼容性 …

vue中引入及使用wow.js

1. 安装 npm install wowjs --save (animate.css会被自动安装,但是这里有坑) 2. 在main.js中引入animate.css 引入时需要注意看是引入的哪个animate.css文件,在后面有详细讲解。 3. 引入wow.js并初始化 这里方法有二 方法1 在main.js中添加 impor…

http://bbs.duowan.com/forum.php,多玩论坛宣告关闭 国内游戏社区又少一个

2019年的今天还有人上论坛吗?有是肯定有的,但是论坛在国内的发展情况是注定的了,最近几年来大大小小的网站都关闭过旗下的论坛。今天没注意,很有名的多玩也宣布关闭论坛,今年12月31日后停止服务。 多玩之前、现在都是国…

Lottery抽奖项目第二章第二节:搭建DDD四层结构

搭建DDD四层结构 DDD:Domain Driven Design 描述:基于DDD架构构建,初始化搭建工程结构 本节是陆续搭建系统和编码的开始,我们会优先完成一个基础工程的创建。一般在互联网企业这部分工作可能不需要反复处理,只需要在…