Java基础之ConcurrentHashMap答非所问
ConcurrentHashMap的数据结构是什么?
ConcurrentHashMap仅仅是HashMap的线程安全版本,针对HashMap的线程安全优化,所以HashMap有的特点ConcurrentHashMap同意具有, ConcurrentHashMap的数据结构跟HashMap是一样的。
在JDK7版本使用数组+链表的结构。具体来说是使用了Segment数组 + HashEntry数组 + HashEntry链表,看起来就像是Segment数组 + HashMap的结构,线程安全精确到分段数组的每个节点。在保证Map线程安全的前提下,尽量提升吞吐量。

在JDK8版本使用数组+链表/红黑树的结构。放弃了Segment数组和HashEntry数组。

ConcurrentHashMap如何保证线程安全?
JDK7版本是使用Segment将一个table数组分解成多个Segment数组,Segment又是由多个链表构成的。而put方法,会从头到尾再加上锁。

1.8版本是使用synchronized关键字修饰具体执行数据插入的部分,这是跟Hashtable很大的不同,而且这个锁是加在table上的头节点上的,不影响。

同样是线程安全的HashMap,为什么ConcurrentHashMap要比HashTable效率高?
HashTable的线程安全实现方式较为粗暴,采用了将所有的方法都使用synchronized关键字修饰,而ConcurrentHashMap的线程安全在JDK7版本是采用的分段锁的方式来实现的,在JDK8版本中是采用CAS + synchronized方式实现的。从这段描述中就能看出,HashTable的锁粒度都是方法级的,而ConcurrentHashMap的锁粒度更小。
既然ConcurrentHashMap那么好,为什么还需要HashTable?
ConcurrentHashMap效率高是因为他牺牲了一定的安全性的基础上达到的。在执行扩容时,put会阻塞,而get会去获取老数据,这样就产生了数据不一致的问题。而这种情况HashTable是不会发生的,因为他是全表锁。
ConcurrentHashMap1.8版本的sizeCtl是干什么用的?
sizeCtl的作用是标注数组数组状态:
- 0表明数组未初始化;
- 负数且小于-1,表明此时有|N + 1|个线程正在对数组进行扩容;
- 正数存在两种情况:在数组未初始化时,sizeCtl表明数组的初始容量;在数组已初始化时,sizeCtl表明数组的扩容阈值;
- -1表明数组正在被初始化;

ConcurrentHashMap什么时候用链表,什么时候用红黑树?
默认是用链表存储的。在table的长度大于64且Node链表长度大于等于8的时候会将链表转成红黑树。在红黑树节点数量小于等于6时,将红黑树转成链表。
为什么树化的阈值和链表化的阈值不同呢?
大概是为了避免当节点长度处于7个的时候,增删节点造成反复转换存储结构吧。
相关文章:
Java基础之ConcurrentHashMap答非所问
ConcurrentHashMap的数据结构是什么? ConcurrentHashMap仅仅是HashMap的线程安全版本,针对HashMap的线程安全优化,所以HashMap有的特点ConcurrentHashMap同意具有, ConcurrentHashMap的数据结构跟HashMap是一样的。 在JDK7版本使用…...
「锂」清思绪,触达未来 | 锂电池企业如何实现数字化破局?
锂电池制造的困局与破局 锂电池行业产业链的上游主要为正负极材料、电解液、电极基材、隔膜等领域的供应商;中游为电芯制造及封装行业;下游则主要是动力电池、消费电子等锂电池的应用领域。 图1:锂电池行业产业链 近年来,随着相…...
量化散户交易数据:追涨爆亏99%,杀跌少赚28倍?| 追涨杀跌一时爽,散户钱包火葬场?【邢不行】
你第一次炒股的经历是不是这样的: 你有一个朋友,他说在XX股票上大赚了一笔,你听后是既羡慕又不服。 于是你下载了炒股软件,看了眼这只股票,有点心动。但由于没有交易经验,股价又确实涨了不少,…...
Eclipse字体大小设置的5个步骤
Eclipse是一款非常流行的Java集成开发环境(IDE),它被广泛地用于开发Java应用程序。在Eclipse中,字体大小对于用户体验至关重要。因此,了解如何在Eclipse中设置字体大小是非常有用的。 1、打开Eclipse 首先,打开Eclipse IDE。如果E…...
qt creator添加build步骤删除某个文件
参考:https://blog.csdn.net/weixin_44436546/article/details/113587115 1. windows下配置: 添加build步骤;在commad栏输入cmd,会弹出C:\Windows\system32\cmd.exe;在Arguments栏输入/c release\upgrade.o;Working …...
四. AMS源码分析
AMS 主要负责四大组件的启动、切换和调度以及应用程序的管理和调度工作. ActivityManager的组成主要分为以下几个部分: 服务代理: 由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信服务中枢: ActivityManagerNative,继承自Binder并实现了IActivityMana…...
OpenGL进阶 | 绘制一个三角形
一、准备绘图数据 VBO(Vertex Buffer Object) 在opengl中,所有的数据都要放在显存中,通过VBO(Vertex Buffer Object)可将CPU数据传到GPU。 VBO(Vertex Buffer Object)是OpenGL中的一…...
CSAPP Lab3- bufbomb
实验目标 (1)掌握函数调用时的栈帧结构 (2)利用输入缓冲区的溢出漏洞,将攻击代码嵌入当前程序的栈帧中,使得程序执行我们所期望的过程 实验代码 (1)makecookie:生成c…...
分布式系统之CAP定理介绍
前言 在分布式系统的设计和实现中,CAP定理是一个非常重要的概念。本文将介绍CAP定理的概念、含义和应用。 什么是 CAP 定理? CAP定理是分布式系统设计中的一个基本原则,它指出,在分布式系统中,一致性(Consi…...
vcomp140.dll怎么安装?提示vcomp140.dll丢失怎样修复?
在用电脑玩游戏或者打开软件工作的时候,电脑提示vcomp140.dll丢失无法执行此代码,是什么回事呢?需要怎么修复呢?不用紧张,小编今天就把vcomp140.dll文件修复方法分享给大家。我总结了几个修复经验; vcomp14…...
CA OpenSSL自签名证书(服务器/客户端)
参考文章 https://juejin.cn/post/7092789498823573518 https://blog.csdn.net/mengting2040/article/details/120001810 目录 使用 OpenSSL 生成证书创建根证书创建 Root Pair创建 Root Key创建 Root Crt 创建服务器端证书创建服务器端keyip需要换成自己服务器的外网ip地址&am…...
计算机视觉(4)—— 未有深度学习之前
目录 四、未有深度学习之前 4.1 图像分割 4.1.1 基于阈值分割 4.1.2 基于边缘分割 4.1.3 基于区域分割 (1)区域生长法 (2)分水岭算法 4.1.4 基于图论分割 (1)Graph Cuts 分割 (2&…...
怎么获取winform中动态代码生成的控件的状态
winform怎么获取动态代码生成窗口里面的控件的属性状态 MainForm中调用 private void ShowPropertyForm() { PropertyForm form new PropertyForm(selectedShape); form.ShowDialog(); pictureBox1.Refresh(); …...
Windows安装Maven并配置环境
Windows下安装和配置Maven的步骤 介绍:步骤:步骤 1:下载Maven步骤 2:解压缩Maven分发包步骤 3:设置环境变量步骤 4:验证安装 结论: 介绍: Maven是一个非常流行的构建和项目管理工具…...
致力于中小企业JavaEE企业级快速开发平台、后台框架平台
一、开源项目简介 J2eeFAST 是一个 Java EE 企业级快速开发平台, 致力于打造中小企业最好用的开源免费的后台框架平台 。系统基于(Spring Boot、Spring MVC、Apache Shiro、MyBatis-Plus、Freemarker、Bootstrap、AdminLTE)经典技术开发&…...
【神经网络】tensorflow实验9--分类问题
1. 实验目的 ①掌握逻辑回归的基本原理,实现分类器,完成多分类任务; ②掌握逻辑回归中的平方损失函数、交叉熵损失函数以及平均交叉熵损失函数。 2. 实验内容 ①能够使用TensorFlow计算Sigmoid函数、准确率、交叉熵损失函数等,…...
LeetCode2. 两数相加
写在前面: 题目链接:LeetCode2两数相加 编程语言:C 题目难度:中等 一、题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 …...
基于无线传感网络(WSN)的目标跟踪技术(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 无线传感器网络由于其自组织性、鲁棒性及节点数量巨大的特点,非常适合于目标跟踪。无线传感器网络中的移动目标跟踪实际上就是…...
百度发布首个可信AI工具集TrustAI,助力数据分析与增强
百度发布首个集分析与增强于一体的可信AI工具集TrustAI,该工具集旨在帮助用户快速、准确地对各种类型的数据进行分析和增强,从而提高数据的价值和可信度。 随着人工智能技术的快速发展,数据的价值和重要性日益凸显。然而,在数据处…...
电力系统负荷与电价预测优化模型(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
