Java高并发编程实战7,ConcurrentHashMap详解

news/2024/5/10 7:26:43/文章来源:https://blog.csdn.net/guorui_java/article/details/127142317

一、ConcurrentHashMap详解

1、HashMap

在JDK1.8以前,HashMap是基于数组 + 链表来实现的,HashMap是一个数组,每个数组元素又是一张链表。

当向HashMap中增加元素时,会先根据此元素Key的hash值计算出该元素将要保存在数组中的下标。如果多个元素计算出的下标值相同,就会以链表的形式存储在数组的同一个元素中。
在这里插入图片描述

2、JDK1.7中的ConcurrentHashMap

JDK1.7中的ConcurrentHashMap间接地实现了Map,并将每一个元素称为分段锁segment,每个segment都是一个HashEntry<K,V>数组,称为table,table的每个元素都是一个HashEntry的单向队列。
在这里插入图片描述
默认情况下,ConcurrentHashMap会生成16个segment。

ConcurrentHashMap结构的目的是更加细粒度的给元素加锁,**HashTable是给整个容器加锁,ConcurrentHashMap是给每个segment加锁,**当一个线程修改segment 0时,其他线程也可以修改其它segment,即 只要不同的线程同一时刻访问的是不同的segment,就不会发生写冲突,比HashMap性能更好。

3、JDK1.8中的ConcurrentHashMap

JDK1.8中的Map数据结构改为数组+链表/红黑树的形式,加锁粒度更加小,性能更好。

当链表中的元素超过8个时,HashMap就会将链表转换为红黑树。

ConcurrentHashMap也改为了数组+链表/红黑树的形式,废弃了segment,直接采用volatile HashEntry<K,V>对象保存,即对每一条数据直接通过volatile避免冲突,此外,JDK1.8中还对ConcurrentHashMap使用了更多的synchronized和CAS算法来保证线程安全。

在这里插入图片描述

二、CopyOnWrite

CopyOnWrite的操作步骤:

  1. 遇到写操作时,先将当前容器复制一份,然后向新容器里添加元素;
  2. 原容器可以处理读请求;
  3. 增加完元素后,再讲引用指向新的容器,原容器等待被GC回收;

CopyOnWrite利用冗余实现了读写分离,这样一来,既没有加锁,又以读写分离的形式处理了并发的读和写请求。
原容器负责读操作,新容器负责写操作,写完之后,再将引用指向新容器,回收原容器;

  • 写少读多的业务,更适合使用CopyOnWrite容器;
  • 写多读少的情况,就不适合,因为容器的复制比较消耗性能;
    在这里插入图片描述

三、BlockingQueue

BlockingQueue是线程安全的Queue,看一下BlockingQueue有哪些方法:
在这里插入图片描述

1、常用方法如下

  1. add():向BlockingQueue中增加元素,如果BlockingQueue中有剩余空间,则返回true,否则抛出异常,通常与poll()配合使用;
  2. offer():向BlockingQueue中增加元素,如果BlockingQueue中有剩余空间,则返回true,否则返回false,通常与poll()配合使用;
  3. put():向BlockingQueue中增加元素,如果BlockingQueue中有剩余空间,则直接入队,否则当前线程会一直等待,直到BlockingQueue中有剩余空间,通常与take()配合使用;
  4. poll():取出BlockingQueue队首元素,如果队列为空,则会持续等待一定的时间,如果等待之后队列仍然为空,则返回NULL;
  5. take():取出BlockingQueue队首元素,如果队列为空,则当前线程一直等待;
  6. contains():判断队列中是否包含某元素
  7. drainTo(Collection c):将队列中的元素全部转移到集合c中;
  8. drainTo(Collection c, int maxElements):将队列中的前maxElements个元素,转移到集合c中;
  9. remove():移除队列中的某元素

2、BlockingQueue的实现类

  1. ArrayBlockingQueue:由数组构成的有界阻塞队列,队列的大小由构造方法的参数指定,主要应用于生产速度和消费速度基本匹配的场景;
  2. LinkedBlockingQueue:由链表结构组成的有界阻塞队列,队列的大小由构造方法的参数指定,线程池大部分都是直接使用LinkedBlockingQueue;
  3. PriorityBlockingQueue:支持优先级排序的无界阻塞队列,排序规则可以通过构造方法中的Comparator对象指定,主要应用于电商抢购、会员的优先级、银行办理业务、VIP优先插队等场景;
  4. DelayQueue:支持延迟存取的无界队列,队列中的某个元素必须在一段时间后才能被取出;

Java高并发编程实战系列文章

Java高并发编程实战1,那些年学过的锁

Java高并发编程实战2,原子性、可见性、有序性,傻傻分不清

Java高并发编程实战3,Java内存模型与Java对象结构

Java高并发编程实战4,synchronized与Lock底层原理

Java高并发编程实战5,异步注解@Async自定义线程池

Java高并发编程实战6,通过AQS源码分析lock()锁机制

哪吒精品系列文章

Java学习路线总结,搬砖工逆袭Java架构师

10万字208道Java经典面试题总结(附答案)

SQL性能优化的21个小技巧

Java基础教程系列

Spring Boot 进阶实战
在这里插入图片描述

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

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

相关文章

SqlServer2008R2自动删除备份

https://blog.51cto.com/u_15162069/2776830 首先我们打开SqlServer管理工具(SSMS),在左侧目录中找到 管理-->右键维护计划-->新建维护计划双击左侧下方目录:创建 ”清除维护“ 任务双击后打开提示窗口,我们设置 “清除维护” 任务内容:即:在删除本机数据库中,C:\T…

手写数字识别的数据集讲解

CLASS torchvision.datasets.MNIST(root: str, train: bool True, transform: Optional[Callable] None, target_transform: Optional[Callable] None, download: bool False) root (string)&#xff1a; 表示数据集的根目录&#xff0c;其中根目录存放MNIST/processed/tra…

【初学者】Vue使用axios向Node.js发起请求以及跨域问题的解决

目录 项目创建 代码 解决跨域问题 几个注意点 运行结果展示 axios官方文档&#xff1a;起步 | Axios 中文文档 | Axios 中文网 项目创建 本文实例用到的两个项目&#xff0c;分别命名为server和vue-axios。 server是node.js项目&#xff0c;创建方式&#xff1a; # 创建…

Codeforces Round #825 (Div. 2)

A. Make A Equal to B Sample input 5 3 1 0 1 0 0 1 4 1 1 0 0 0 1 1 1 2 1 1 1 1 4 1 0 0 1 0 1 1 0 1 0 1 Sample output 1 2 0 1 1 题意&#xff1a; 你有两个长度为n的数组a和b&#xff0c;你可以进行一次操作&#xff0c;将a数组的某个位置的数取反&#xff0c;或者…

LVM与磁盘配额

分区的缺点: 1、一旦建立无法修改 想修改得重新格式化 数据丢失 2、不够灵活 空间只能来自一块硬盘,且必须是连续的空间 3、没有备份冗余功能 需要工程师手动备份如果没有lvm可以下载:yum install lvm2 -y LVM的管理命令 主要命令:LVM为我们提供了逻辑概念上的磁盘,使得文…

usb sop and eop

USB包(packet)由SOP,SYNC,Packet内容和EOP组成. SOP信号-------------瞬态信号 协议中的描述&#xff1a;7.1.7.4.1 The start of a packet (SOP) is signaled by the originating port by driving the D and D- lines from the Idle state to the opposite logic level (K …

实验六:倾斜开关实验

OK,周一周二一共10节课,比较辛苦,昨天下午还有咨询师模拟演练,很累,就早早休息了 今天早上就想写一个实验指导书 也就是现在的实验六 一会十点有《C语言程序设计》的课,不过,今天好在就只有两节课(课时,一次大课2个课时,习惯说2节课) 感觉又是我最喜欢和擅长的C…

JSON——简介

JSON——简介 JSON——基础语法 JSON——json数据与java对象的转换// 将java对象转为json字符串User user = new User(1,"zahngsan","123");// 转换String jsonString = JSON.toJSONString(user);System.out.println(jsonString);// 将json字符串转为jav…

java基于vue+springboot 的体育用品销售购物网站 多商家 nodejs

用户在打开网站之后首先打开的是首页部分&#xff0c;在首页部分可以看到一些推荐的信息 环境需要 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;这是目前最稳定的JDK也是被使用最多的JDK版本。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse都可以。推荐IDEA; 3.to…

移动端IM产品RainbowChat[专业版] iOS端 v6.0版已发布!

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、标准Java平台&#xff0c;服务端基于Netty编写。 工程开源地址是&…

分治法实现二分查找(python)

问题描述&#xff1a; 改写二分查找算法&#xff1a;设a[1…n]是一个已经排好序的数组&#xff0c;改写二分查找算法: 当搜索元素x不在数组中时&#xff0c;返回小于x的最大元素位置i&#xff0c;和大于x的最小元素位置j&#xff1b; (即返回x的左、右2个元素) 当搜索元素x在…

系动词使役动词

系动词 系动词的作用就是赋值 I am a rabbit 把 a rabbit赋值给i我 我是一只兔子 The rabbit is smart 这兔子是聪明的 smart赋值给兔子 系动词连系的方式,就是简简单单把它前后的概念含义连起来而已 所以系动词又叫连系动词 (Linking Verb) 就是把前后两端连起来(link)就好…

基于侧影轮廓的三维模型构建

建模过程 图像的获取 由于待建模物体具有较多细节,因此选择在同一个方向拍摄两个角度的照片(手机倾斜角大约为60度和45度,如下图所示),以及顶部细节照片,最终拍摄的有效照片为35张。模型构建 新建项目,并导入所有拍摄的照片照片掩饰 可以先采用自动掩饰工具将物体轮廓从…

kotlin koin

介绍 Koin是一个面向Android developer的依赖注入框架使用场景 为什么要用依赖注入框架? 比如我们有一个下载器对象Downloader,需要下面三个对象才能完成构造。但是这个下载器对象在各个活动中使用频繁val executor = Executor() val client = HttpClient() val request = Re…

使用 Zpan 搭建低成本个人私有网盘,还不限速

摘要&#xff1a;本文就介绍一个不限速的低成本个人网盘——ZPan&#xff0c;相较于老牌的私有网盘 OwnCloud 等&#xff0c;Zpan 有一个独有的优势&#xff1a;不限速。本文分享自华为云社区《使用 Zpan 搭建低成本个人私有网盘》&#xff0c;作者&#xff1a; 云存储开发者支…

甘特图:制定项目计划的三个要点

任何事情都要有计划&#xff0c;这样才能保证自己的事情按照既定的目标和轨迹推进 制定计划首先要明确以下三点&#xff1a; 1、目标明确&#xff1a;做这个项目是做什么的要达成什么目标。 2、任务明确&#xff1a;达成这个目标要做哪些事&#xff0c;有具体的实施推进步骤。…

MP-SPDZ详细介绍

基础知识概述 隐私计算底层协议包括两种&#xff1a;其一是基础的加密传输协议&#xff0c;用于信息分发&#xff0c;包括不经意传输、秘密分享、同态加密、零知识证明等。其二是加密计算协议&#xff0c;包括乱码电路、同态加密、零知识证明等。 不经意传输是所有隐私计算协…

python 运行错误收集

目录global全局声明错误 global全局声明错误 SyntaxError: name is_login is used prior to global declaration 解决办法:global is_login 放在 if is_login:的上面 is_login = Falsedef login_auth(func_name):def inner(*args, **kwargs):if is_login:res = func_name(*arg…

AlphaZero强化学习模型

搬来了DeepMind的AlphaTensor DeepMind前不久发在Nature上的论文Discovering faster matrix multiplication algorithms with reinforcement learning引发热议。 这篇论文在德国数学家Volken Strassen「用加法换乘法」思路和算法的基础上&#xff0c;构建了一个基于AlphaZero…

[GWCTF 2019]我有一个数据库

打开题目是乱码&#xff0c;好奇怪 御剑扫一下 扫到了phpmyadmin 版本为4.8.1 这个版本是有漏洞的&#xff08;CVE-2018-12613&#xff09;&#xff0c;复现一下 部分源码&#xff1a; $target_blacklist array (import.php, export.php ); ​ // If we have a valid target…