CurrentMap总结

JAVA基礎之ConcurrentHashMap JAVA基礎之ConcurrentHashMap 简介 ConcurrentHashMap 是 util.concurrent 包的重要成员。本文将结合 Java 内存模型,分析 JDK 源代码,探索 ConcurrentHashMap 高并发的具体实现机制。 由于 ConcurrentHashMap 的源代码实现依赖于 Java 内存模型,所以阅读本文需要读者了解 Java 内存模型。同时,ConcurrentHashMap 的源代码会涉及到散列算法和链表数据结构,所以,读者需要对散列算法和基于链表的数据 阅读详情

简单介绍CurrentHashMap

ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合;

ConcurrentHashMap是一个线程安全,并且是一个高效的HashMap。
spring 缓存注解 通过查看源代码发现将数据存在ConcurrentMap中

Map并发原理

  • ConcurrentMap
    • ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合;
    • 在原有java.util.map接口基础上又新提供了4种方法,进一步扩展了原有Map的功能:
    •  public interface ConcurrentMap<K, V> extends Map<K, V> {
      
      //插入元素
      V putIfAbsent(K key, V value);
      
      //移除元素
      boolean remove(Object key, Object value);
      
      //替换元素
      boolean replace(K key, V oldValue, V newValue);
      
      //替换元素
      V replace(K key, V value);
      }
      
      putIfAbsent:与原有put方法不同的是,putIfAbsent方法中如果插入的key相同,则不替换原有的value值;
      remove:与原有remove方法不同的是,新remove方法中增加了对value的判断,如果要删除的key--value不能与Map中原有的key--value对应上,则不会删除该元素;
      replace(K,V,V):增加了对value值的判断,如果key--oldValue能与Map中原有的key--value对应上,才进行替换操作;
      replace(K,V):与上面的replace不同的是,此replace不会对Map中原有的key--value进行比较,如果key存在则直接替换;
      
    • 其实,对于ConcurrentMap来说,我们更关注Map本身的操作,在并发情况下是如何实现数据安全的。在java.util.concurrent包中,ConcurrentMap的实现类主要以ConcurrentHashMap为主。接下来,我们具体来看下。
  • ConcurrentHashMap
    *ConcurrentHashMap是一个线程安全,并且是一个高效的HashMap。
    但是,如果从线程安全的角度来说,HashTable已经是一个线程安全的HashMap,那推出ConcurrentHashMap的意义又是什么呢?
    说起ConcurrentHashMap,就不得不先提及下HashMap在线程不安全的表现,以及HashTable的效率!
  • HashMap
    • 底层数据结构不一样,1.7是数组+链表,1.8则是数组+链表+红黑树结构(当链表长度大于8,转为红黑树)。
      JDK1.8中resize()方法在表为空时,创建表;在表不为空时,扩容;而JDK1.7中resize()方法负责扩容,inflateTable()负责创建表。
       1.8中没有区分键为null的情况,而1.7版本中对于键为null的情况调用putForNullKey()方法。但是两个版本中如果键为null,那么调用hash()方法得到的都将是0,所以键为null的元素都始终位于哈希表table【0】中。
      当1.8中的桶中元素处于链表的情况,遍历的同时最后如果没有匹配的,直接将节点添加到链表尾部;而1.7在遍历的同时没有添加数据,而是另外调用了addEntry()方法,将节点添加到链表头部。
      1.7中新增节点采用头插法,1.8中新增节点采用尾插法。这也是为什么1.8不容易出现环型链表的原因。
      1.7中是通过更改hashSeed值修改节点的hash值从而达到rehash时的链表分散,而1.8中键的hash值不会改变,rehash时根据(hash&oldCap)==0将链表分散。
       1.8rehash时保证原链表的顺序,而1.7中rehash时有可能改变链表的顺序(头插法导致)。
      在扩容的时候:1.7在插入数据之前扩容,而1.8插入数据成功之后扩容。
  • CurrentHashMap
    • 与HashMap不同的是,ConcurrentHashMap中多了一层数组结构,由Segment和HashEntry两个数组组成。其中Segment起到了加锁同步的作用,而HashEntry则起到了存储K.V键值对的作用。在ConcurrentHashMap中,每一个ConcurrentHashMap都包含了一个Segment数组,在Segment数组中每一个Segment对象则又包含了一个HashEntry数组,而在HashEntry数组中,每一个HashEntry对象保存K-V数据的同时又形成了链表结构,此时与HashMap结构相同。在多线程中,每一个Segment对象守护了一个HashEntry数组,当对ConcurrentHashMap中的元素修改时,在获取到对应的Segment数组角标后,都会对此Segment对象加锁,之后再去操作后面的HashEntry元素,这样每一个Segment对象下,都形成了一个小小的HashMap,在保证数据安全性的同时,又提高了同步的效率。只要不是操作同一个Segment对象的话,就不会出现线程等待的问题!
关于Maps.newConcurrentMap();的使用方法,一篇文章讲清楚如何使用Maps.newConcurrentMap,以后千万别再用new HashMap<>()了 如果该键已经存在于哈希表中,则该方法返回键对应的值,否则会将键值对添加到哈希表中,并返回。接口中定义的一个方法,用于向哈希表中添加一个键值对,但是只有在该键不存在时才进行添加操作,否则返回已存在的值。然后,我们向这个哈希表中添加了三个键值对,分别是 “a”->1、“b”->2 和 “c”->3。方法删除键为 “c” 的键值对,并增加一个条件,只有在键为 “b” 的值等于 2 时才进行删除操作。方法增加一个条件,只有在键为 “b” 的值等于 2 时才进行替换操作,并将其替换为 20。 阅读详情

相关推荐

ConcurrentHashMap:使用方法和底层原理详解

ConcurrentHashMap是Java集合框架中的一个线程安全的哈希表实现,它提供了比Hashtable和同步的HashMap更高的并发性能。ConcurrentHashMap在JDK 1.5中引入,通过采用分段锁的方式实现了高效的并发访问。它可以在保证线程安全的同时,提供较高的并发性能,因此是多线程环境下使用频率较高的数据结构之一。

jakelihua 4520

java concurrentmap遍历_Java集合--ConcurrentMap

1 Map并发集合1.1 ConcurrentMapConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合;在原有java.util.map接口基础上又新提供了4种方法,进一步扩展了原有Map的功能:public interface ConcurrentMap extends Map {//插入元素V putIfAbsent(K key, V value)...

weixin_36293915的博客 788

ECharts 5.4 离线地图实战:3步加载本地JSON,实现省市区三级下钻

本文详细介绍了如何使用ECharts 5.4实现离线地图的三级下钻功能,包括本地JSON文件的加载、地图注册与初始化、动态加载及交互实现。通过实战案例,帮助开发者在内网环境中高效完成数据可视化项目,特别适合需要保障数据安全的场景。

weixin_33994429的博客 701

并发编程-concurrent指南-ConcurrentMap

ConcurrentMap 是个接口,你想要使用它的话就得使用它的实现类之一。 ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合; 在原有java.util.map接口基础上又新提供了4种方法,进一步扩展了原有Map的功能: public interface ConcurrentMap<K, V> extends M...

weixin_30407613的博客 1165

ECharts 5.4 离线地图数据集成:3步完成全国及34个省级行政区可视化

本文详细介绍了ECharts 5.4离线地图数据集成方法,通过3步完成全国及34个省级行政区可视化。内容涵盖JSON数据文件获取、地图注册逻辑及多级下钻实现,适用于政务、金融等对数据安全要求高的领域,帮助开发者在离线环境中高效构建地图可视化应用。

virusswb的专栏 428

Android Studio推箱子游戏开发:MVC架构实践与期末高分项目指南

移动应用开发的核心在于理解软件架构模式,其中模型-视图-控制器(MVC)架构是实现清晰职责分离的经典设计范式。该架构通过将数据模型、用户界面和控制逻辑解耦,提升了代码的可维护性和可测试性,是Android开发中构建健壮应用的基础。在工程实践中,开发者常需处理自定义视图绘制、触摸事件处理和游戏状态管理等关键技术点,这些技能在游戏开发、工具类应用等场景中具有广泛价值。本文以推箱子游戏为具体案例,深入探讨如何运用MVC架构结合Android Studio进行项目开发,涵盖从数据模型设计到手势交互实现的全流程,为计

469

ConcurrentHashMap之实现细节

实现原理锁分离 (Lock Stripping) ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。 有些...

qq_42112846的博客 278

基于STM32的3D打印机控制

通过本项目,我们成功搭建了一个基础的3D打印机控制系统,能够控制步进电机和加热元件。这为使用STM32开发功能丰富的3D打印机提供了基础,您可以在此基础上继续扩展功能,如增加LCD显示、SD卡存储、联网控制等功能。在这个项目中,我们将使用STM32微控制器开发一个基础的3D打印机控制系统。通过控制步进电机、加热元件和温度传感器,我们将实现一个简单的FDM(熔融沉积制造)3D打印机控制。- 检查PWM信号的生成功能,确认加热元件的控制逻辑是否正常。- 增加适当的滤波和校准算法,以提高温度读取的准确性。

2401_88938661的博客 1502

CurrentMap

/* * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * * * * * * * * * * * * * * * * * * * * */ /* * * * * * * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Group and released to t.

西橙先生 416

ROS实践(四)机器人SLAM建图(gmapping)

本文介绍了SLAM技术及其实现方法。SLAM(同步定位与地图构建)让机器人在未知环境中通过传感器数据自主定位并构建地图。文章详细讲解了激光雷达、RGBD相机等常用传感器,以及gmapping和map_server这两个ROS功能包的使用方法。重点阐述了SLAM建图实验步骤:配置gmapping节点参数、启动机器人仿真、运行gmapping节点、使用rviz可视化工具、通过键盘遥控机器人完成地图构建并保存。实验结果表明,该方法能有效实现机器人自主建图功能,为后续导航等应用奠定基础。

qq_1033275663的博客 4331

解决 maven编译项目-Fatal error compiling: 无效的目标发行版: 21 -> [Help 1]

惊奇的发现,maven没有用环境变量中设置好的JAVA_HOME目录,至此发现错误原因,原来执行java -version默认使用系统环境变量JAVA_HOME,而maven优先使用了windows的用户变量JAVA_HOME(这里之前忘记修改,仍然指向java8路径),修改用户变量JAVA_HOME指向java21或删除该用户变量JAVA_HOME(如无它用)后即可。打开maven包所在的目录,在maven的配置文件 mvn.cmd 文件中,设置java_home的目录。

litlit023的专栏 1799

CurrentMap为什么桶非空就要直接加锁了

这个单一的操作可以通过 CAS (Compare-And-Swap) 这种CPU级别的原子指令来保证线程安全。当桶是空的时候,操作非常简单,只有一步:“

2302_80742310的博客 109

Boot过程相关镜像详解:IVT、DCD、App Boot镜像到底是什么?

S32系列芯片中常说的IVT镜像、DCD镜像等跟Boot过程相关的镜像到底是什么,镜像结构长啥样?各镜像作用是什么?主分区和备份区的概念?答案统统在这里!!

车载系统攻城狮 4252

HashMap/HashTable/CurrentMap

相同点: 1.HashMap和HashTable都可以用来存储key-value的数据 区别: HashMap是线程不安全的,效率高,可以使用null作为键值对 HashTable是线程安全的,效率低 想线程安全又效率高: 通过把整个Map分为N个segment(类似于HashMap),可以提供相同的线程锁,但是效率提升N倍,默认提升16倍 转载于:https...

didui0897的博客 164

基于YOLOv8的城市违建识别系统:从数据集构建到UI界面实现

YOLOv8是Ultralytics公司于2023年推出的最新一代YOLO(You Only Look Once)系列目标检测算法。更高效的骨干网络设计改进的锚框机制更精确的损失函数支持分类、检测、分割等多任务YOLOv8特别适合像违建识别这样的实时检测任务,能够在保持高精度的同时实现快速推理。

YOLO 674

国科大学习资料--遥感原理集图像处理(尤红建)--2019年期末考试

国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 国科大学习资料–遥感原理集图像处理(尤红建)–2019年期末考试 ================================================================== ================================================================== ==============

无名何许人的博客 1469

帝国时代-7.10

村民的管理用一张map表实现,实现SN和状态的一一对应,便于后续对村民的调度,在每帧开始时遍历村民,并将其状态存入map表中,其中,状态用几个自定义的int表示:0空闲,3攻击敌军,4砍树,5石头,6瞪羚,7大象,8捕鱼,9黄金,10建造。这个函数提供了上层控制村民搜集资源的接口,type指需要的资源类型,num是分配的人数,在次函数中,首先分配空闲的人收集目的资源,如果空闲人数不足,则按照黄金 < 石头 < 鱼 < 瞪羚 <大象 < 木材的优先级顺序改变人的状态。

OMNIL的博客 162

【学习系列】SAP RAP 29:如何创建Application Jobs(下)

本文介绍了在SAP系统中通过API创建和使用Application Jobs的方法。主要内容包括:1) 创建RAP应用并通过Action调用API创建Jobs;2) 使用事件驱动方式异步更新Job状态;3) 通过URL跳转到标准日志页面;4) 使用Custom Entity获取Job日志;5) 演示遗留接口IF_APJ_DT_EXEC_OBJECT和IF_APJ_RT_EXEC_OBJECT的使用。文章提供了详细的代码示例,展示了如何通过CL_APJ_RT_API=>SCHEDULE_JOB调度作业,

DeveloperMrMeng的博客 376

Iterator 自用的迭代器去重

【代码】Iterator 自用的迭代器去重。

chickenDishss的博客 489

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

LobeHub 状态管理实践:Zustand 中 Detail Map 的 Reducer 模式(类型安全动作 + Immer 不可变更新)

本文围绕 LobeHub 仓库中 Agent 评测(Eval)模块的 Zustand 数据组织规范,深入讲解 `Detail Map`(`Record<string, Detail>`)场景下的 Reducer 模式:如何用可辨识联合(discriminated union)定义类型安全动作、用 Immer 的 `produce` 实现不可变更新,并通过 `internal_*` 内部方法把 re

gitblog_01043的博客 727

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Rimworld Mod进阶:巧用‘冷门’Def打造独特游戏体验,比如用RitualPatternDef设计自定义仪式

本文深入探讨了Rimworld Mod开发中如何利用RitualPatternDef这一冷门Def类型打造独特的游戏仪式体验。通过解析核心XML结构、展示多Def协同设计实战案例,以及分享动态仪式与游戏事件挂钩的高级技巧,帮助Mod开发者创造更具沉浸感的自定义文化仪式。文章特别强调了RitualPatternDef在创造复杂叙事体验方面的潜力,并提供了实用的调试与优化建议。

weixin_30732487的博客 522

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java推箱子游戏开发实战:从零实现经典益智游戏

面向对象编程是Java语言的核心概念,通过将数据和操作封装在对象中实现代码的模块化和重用。在游戏开发领域,推箱子游戏作为经典案例,完美体现了面向对象设计原则的应用价值。该项目采用MVC架构模式,将游戏逻辑分为模型层(地图数据、角色状态)、视图层(Swing图形界面)和控制层(用户交互处理),实现了清晰的职责分离。碰撞检测算法确保角色移动和箱子推动的合法性,状态管理机制跟踪游戏进度和胜负条件。对于Java初学者而言,推箱子项目是巩固数组操作、事件处理、图形渲染等基础知识的理想实践平台,能够帮助开发者从语法学习

weixin_33981932的博客 545

Sprite.js 扩展开发指南:创建自定义插件和工具链

Sprite.js 是一个高效的 JavaScript 精灵动画框架,为开发者提供了丰富的 2D 动画功能和灵活的扩展机制。本文将详细介绍如何为 Sprite.js 创建自定义插件和工具链,帮助你快速扩展框架功能,打造个性化的游戏开发体验。 ## 为什么选择 Sprite.js 扩展开发? Sprite.js 作为轻量级动画框架,核心功能专注于精灵管理和基础动画。通过扩展开发,你可以: - 增

gitblog_00592的博客 308

从“拨云见日”项目解析Web全栈游戏开发:架构、状态管理与API设计

在现代Web应用开发中,状态管理和前后端分离是构建复杂交互体验的核心技术。其原理在于通过清晰的数据流设计,将前端视图、状态逻辑与后端业务规则解耦,前端负责展示与用户交互,后端则作为状态变更的权威仲裁者。这种架构的技术价值在于提升了应用的可维护性、可测试性,并为实时交互提供了坚实基础。其典型应用场景包括在线协作工具、实时仪表盘以及**沉浸式Web游戏**。本文将以一个名为“拨云见日”的**教学范本**级游戏项目为例,深入探讨如何运用Vue.js/Pinia进行前端状态管理,并设计健壮的后端API来优雅地处理游

weixin_33851429的博客 355

RTXNTC 虚拟纹理系统剖析:FeedbackManager 与 RTXTS-TTM 如何配合实现低内存纹理流送

RTXNTC(NVIDIA 神经纹理压缩 SDK,Neural Texture Compression)除了支持"加载时推理"和"采样时推理"两种解码方式外,还提供了一种基于**虚拟纹理流送**的 **Inference on Feedback** 模式。该模式由 [FeedbackManager](https://link.gitcode.com/i/f9dd807cba0f0f5767cab9

gitblog_00387的博客 837
上一篇: SpringBoot事务回滚@Transaction注解
下一篇: ElasticSearch简单的工作总结
lizhuoxuanIQjava
博客等级 码龄7年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值