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

[原创]Step by step 实现自己的AI知识库问答(二)

对小白很友好的AI智能问答开发保姆级教程,适合初级开发者、学生阅读参考,无限制分享,欢迎转载。在这个章节中,我们使用了百度千帆作为知识库,通过简单的代码调用API实现了智能问答。

BaiRiYiSanJin的博客 1470

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

基于PaddleX的垃圾分类识别

基于PaddleX的智能垃圾分类识别项目,使用百度开源的PaddlePaddle深度学习框架,结合PaddleX开发套件,实现对垃圾分类的识别检测

Mefishes的博客 8119

【宠物识别系统】设计框架

能跑通的 Demo。收集 10,000 张同品种但不同个体的图片。训练ArcFace模型,验证准确率能否达到 99% 以上。搭建Milvus向量数据库。开发移动端 App/小程序。加入“图像质量检测”和“用户反馈纠错”功能。你是更偏向于做软件服务(如寻宠App、保险API),还是做软硬结合的产品(如智能喂食器)?这决定了我们下一步是深挖云端高并发架构,还是边缘端模型压缩。更偏向于软件,应用更广泛些,继续既然专注于纯软件/SaaS (Software as a Service) 方向。

百态·数智思维 | 聚焦大数据、量化与未来AI 1413

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

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

2302_80742310的博客 109

WhatsApp API接口的隐秘角落:从协议解析到自定义消息引擎

本文深入解析WhatsApp API接口的隐秘角落,从协议逆向工程到自定义消息引擎开发实战。通过分析WhatsApp的二进制XML协议和加密机制,构建超越官方API限制的自定义消息引擎,实现高效、灵活的即时通讯解决方案。文章还提供了企业级架构设计和风控规避策略,助力开发者突破官方限制,提升消息到达率和成本效益。

q3r4s5t的博客 761

HashMap/HashTable/CurrentMap

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

didui0897的博客 164

服务器测试之GPU基础汇总

GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。一个专门的图形核心处理器。GPU是显示卡的“大脑”,决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。可以形象的理解为90%的ALU(运算单元),5%的Control(控制单元)、5%的Cache(缓存单元)GPU的设计原理——总结为大量的简单运算。

qq_41897488的博客 2万+

YOLO11涨点优化:Loss魔改 | WIoU (Wise-IoU) v3版本全面替换,基于动态非单调聚焦机制,让模型更聪明地学习

YOLOv11目标检测中的WIoU v3损失函数改进 本文探讨了YOLOv11目标检测模型中CIoU损失函数的局限性,并提出了WIoU v3改进方案。关键发现包括: CIoU的缺陷:在低质量样本(小目标/遮挡目标)上过度惩罚,导致模型优化方向偏离,小目标AP往往比大目标低30%左右。 WIoU v3的创新: 动态非单调聚焦机制:根据样本"离群度"智能分配梯度 让模型重点优化中等质量样本,减少对低质量样本的无效关注 采用指数移动平均来自适应调整质量评判标准 实际效果:WIoU v3在保持大

2601_95807009的博客 422

帝国时代-7.10

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

OMNIL的博客 162

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

详解Xilinx FPGA高速串行收发器GTX/GTP(6)--Pattern Generator/Pattern Checker

孤独的单刀 1625

Iterator 自用的迭代器去重

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

chickenDishss的博客 489

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

weixin_30732487的博客 522

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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、付费专栏及课程。

余额充值