JUC安全/非安全容器

news2024/12/26 10:48:57

一、JUC

java.util.concurrent下的类就叫JUC类,JUC下典型的类有:
1.ReentrantLock可重入锁
2.Semaphore信号量
3.CountDownLatch计数器
4.CyclicBarrier循环屏障

二、线程安全&非安全容器

2.1非线性安全容器

在这里插入图片描述

2.2线性安全容器

在这里插入图片描述

三、关于HashMap

hashMap是不安全的,体现如下:

  1. 在jdk1.7中,多线程环境下,扩容时因为采用头插法会造成环形链或数据丢失。
  2. 在jdk1,8中,多线程环境下,会发生数据覆盖问题

3.1hash JDK1.7死循环

jdk1.7中hashMap是由数组+链表组成
在这里插入图片描述
jdk1.8中hashMap是由数组+红黑树组成
链表升级为红黑树的要求:
当链表长度>8并且数组长度>64时,才会升级为红黑树。
在这里插入图片描述
正常情况下的扩容:
旧hashMap的节点会依次转移到新hashMap中,旧hashMap转移的顺序是A ,B ,C而新hashMap使用的是头插法,所以最终在新hashMap中的顺序是C, B, A如下图所示:
在这里插入图片描述
死循环是因为并发hashMap扩容导致的,并发扩容第一步,线程T1和线程T2要对hashMap进行扩容操作,此时T1和T2指向的是链表的头节点元素A,而T1和T2的下一个节点也就是T1.next和T2.next指向的是B节点,如下图:
在这里插入图片描述
死循环的第二部操作是,线程T2时间片用完进入休眠状态,而线程T1开始执行扩容操作,一直到线程T1扩容完成后,线程T2才被唤醒,扩容之后的场景如下图:
在这里插入图片描述
在这里插入图片描述
从上图可知线程T1执行之后,因为是头插法,所以HashMap的顺序已经发生了变化,但线程T2对于发生的一切是不可知的,所以它的指向元素依然没变,T2指向的是A元素,T2.next指向的节点是B元素。

3.2线程安全的字典

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

3.2.1Hashtable

Hashtable只是简单的把关键方法加上了 synchronized 关键字,这相当于直接对Hashtable对象本身加锁,但这样效率很低。

3.2.2ConcurrentHashMap

ConcurrentHashMap在不同的JDK中实现是不一样的。
在 JDK 1.7 中它使用的是数组加链表的形式实现的,而数组⼜分为:大数组 Segment 和小数组 HashEntry
在这里插入图片描述
ConcurrentHashMap 的线程安全是建立在 Segment 加锁的基础上的,所以我们把它称之为分段锁或片段锁,如下图:
在这里插入图片描述
在 JDK 1.7 中,ConcurrentHashMap 虽然是线程安全的,但因为它的底层实现是数组 + 链表的形式,所以在数据比较多的情况下访问是很慢的,因为要遍历整个链表,⽽ JDK 1.8 则使用了数组 + 链表/红黑树的方式优化了 ConcurrentHashMap 的实现。
在 JDK 1.8 中我们可以简单的认为,ConcurrentHashMap 是在头节点加锁来保证线程安全的,锁的粒度相比 Segment 来说更小了,发生冲突和加锁的频率降低了,并发操作的性能就提高了,具体如下图:
在这里插入图片描述

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

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

相关文章

【谷歌浏览器 -- Vimium 常用快捷键】

文章目录 1.1.1 标签页管理1.1.2 网页操作1.1.3 打开链接1.1.4 搜索1.1.5 自定义搜索引擎短语1.1.6 Vimimu 使用注意事项 Vimium 是一款用键盘控制 Chrome 浏览器的 Chrome 插件, 可以在 Chrome 应用商店下载到. 下面列出个人比较习惯使用的几个快捷键。 1.1.1 标签页管理 [ x…

【C语言】基础语法4:函数和递归

上一篇:控制流程结构 下一篇:数组和指针 ❤️‍🔥前情提要❤️‍🔥   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家…

Cookie、Session、Token的区别

1 网站交互体验升级 1.1 无状态的 http 协议 HTTP 无状态协议,是指协议对于业务处理没有记忆能力,之前做了啥完全记不住,每次请求都是完全独立互不影响的,没有任何上下文信息。 缺少状态意味着如果后续处理需要前面的信息&…

基于蛋白-配体复合物构建药效团的药物设计(Pharmacophore)

基于蛋白-配体复合物构建药效团的药物设计(Pharmacophore) step 1.蛋白-配体复合物准备 点击File-->Import Structures导入之前已经下载好的1IEP.pdb(Abl蛋白和Imatinib的晶体复合物) 蛋白准备:点击Tasks--->…

【数据集实例】CMIP6气候模式数据下载-以河东地区为例

1 数据准备 主要根据研究区域等,介绍下载数据需求。 1.1 研究区域 以甘肃省河东地区为例,分区图如下所示: 数据时间范围如下所示: 历史时段:1970-2014年(共44年)预估时段:2015-2100年此外,根据研究内容,确定下载的变量为: 日尺度降水:缩写为pr日尺度最高/最低温…

OrCAD创建原理图库

OrCAD创建原理图库 概述常规器件建库方法大封装器件建库基于pinout表格创建原理图库导入方法: 通过fsp软件导入fpga原理图库 概述 原理图库是硬件设计的基本工作,每个新人都要先学会建库,才能开始画图,本文主要介绍几种常用的建库…

Linux多线程-4

在了解完多线程的绝大部分概念之后,我们本篇博客作为Linux多线程中的最后一篇博客,来对其中剩余内进行一个收尾。 目录 1.线程池 1.1引入 1.2原理 1.3优点 1.4实现 2.单例模式 2.1内容 2.2原理 2.3实现 2.3.1饿汉模式实现 2.3.2懒汉模式实现…

Web3技术入门向科普

Web3是指下一代互联网,它基于区块链技术,将各种在线活动更加安全、透明和去中心化。Web3是一个广义的概念,它包括了很多方面,如数字货币、去中心化应用、智能合约等等。在这篇文章中,我们将重点讨论Web3的入门知识&…

Opencv+Python笔记(四)图像的形态学处理

1.腐蚀与膨胀 膨胀用来处理缺陷问题,把缺陷填补掉,提高亮区面积; 腐蚀用来处理毛刺问题,把毛刺腐蚀掉,降低亮区面积。 腐蚀操作可以消除噪点,同时消除部分边界值,导致目标图像整体缩小。 膨胀…

轻松掌握安装k8s官方可视化界面工具知识点

轻松掌握安装k8s官方可视化界面工具知识点 1、安装 1、安装资源 kubernetes官方提供的可视化界面 https://github.com/kubernetes/dashboard 执行以下命令 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml…

RocketMq集群搭建

各个角色介绍: producer:消息的发送者;举例:发信者consumer:消息的接受者;举例:收信者broker:暂存和传输消息;举例:邮局NameServer:管理Broker&am…

PWM输出实验

实验内容 使用TIM3来产生PWM输出 使用TIM3的通道2,把通道2重映射到PB5.产生PWM来控制DS0的亮度。 PWM简介 脉冲宽度调制(PWM),简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种有效方法。 脉冲波…

excle表格打印相关问题

ps:无论是打印word,还是打印excel, 最后最好都保存成pdf,再打印。 ps:无论是打印word,还是打印excel, 最后最好都保存成pdf,再打印。 ps:无论是打印word,还是打印excel, 最后最好都保存成pdf,再打印。 …

Android修改头像之拍照、从相册选择、裁剪

手写一个修改头像的需求,头像图片支持手机拍照裁剪和从相册选择图片裁剪; 实现效果: 本节主要内容: 1)头像修改对话框实现; 2)调用系统相机拍照; 3)自定义图片裁剪页…

centos7 配置LNMP环境

文章目录 LNMP环境的搭建LNMP工作流程FastCGI接口配置LNMP部署环境配置环境测试安装 Discuz LNMP环境的搭建 随着我们 Nginx web 服务器的流行,又出现了我们叫做 LNMP 的一种新的 web 环境服务组合。LNMP 就是 Linux Nginx Mysql PHP 等首字母的缩写。现在&…

STL学习+acwing 67 数字在排序数组中出现的次数

题目链接 67. 数字在排序数组中出现的次数 传统暴力解法 class Solution { public:int getNumberOfK(vector<int>& nums , int k) {int c0;for(int i0;i<nums.size();i){if(nums[i]k)c;}return c;} };容器的应用 set和multiset两个容器有一个count函数 set 为…

eBPF 虚拟机是如何工作的?

eBPF 是一个运行在内核中的虚拟机&#xff0c;很多人在初次接触它时&#xff0c;会把它跟系统虚拟化&#xff08;比如 kvm&#xff09;中的虚拟机弄混。其实&#xff0c;虽然都被称为“虚拟机”&#xff0c;系统虚拟化和 eBPF 虚拟机还是有着本质不同的。 系统虚拟化基于 x86 …

vue 中的事件修饰符介绍+示例说明

vue 中的事件修饰符介绍示例说明 Start 最近使用到 vue 的事件修饰符&#xff0c;发现由于时间太过久远&#xff0c;今天快速的过一下 vue 中的事件修饰符. 1. 官方文档 vue2 v-on 点击这里 vue3 v-on 点击这里 vue2中有关 v-on 的介绍 vue3中有关 v-on 的介绍 初步看下…

Ribbon负载均衡·入门·壹

文章目录 1 Ribbon概述1.1 什么是Ribbon1.2 Ribbon解决的问题1.3 什么是负载均衡 2 SpringCloud与Ribbon2.1 集成Ribbong工具类2.2 单独引入Ribbon 3 Ribbon实现负载均衡源码跟踪3.1 打开LoadBalanced3.2 发现Qualifier3.3 LoadBalancerAutoConfiguration自动装配类 1 Ribbon概…

C++入门(后篇)

&#x1f525;&#x1f525;本章重内容 C入门 1.auto关键字(C11)auto的使用细则auto不能使用的场景 2.基于范围的for循环(C11)3.指针空值nullptr(C11) 1.auto关键字(C11) 在早期C/C中auto的含义是&#xff1a;使用auto修饰的变量&#xff0c;是具有自动存储器的局部变量&#…