首页 > 其他分享 >JDK 1.6 与 1.8 中的 ConcurrentHashMap 学习

JDK 1.6 与 1.8 中的 ConcurrentHashMap 学习

时间:2023-06-06 17:05:44浏览次数:50  
标签:1.6 加锁 JDK 1.8 ConcurrentHashMap 链表 put segment



ConcurrentHashMap

使用 segment (继承 ReentrantLock) 和 volatile 来保证线程安全性

segment 的数量为 16,每个 segment 中桶(HashEntry[])的数量可以增加,桶中放的是 由 HashEntry 组成的链表;count 表示 segment 中元素的数量, modCount 统计导致结构变化操作的次数(put、remove、replace、clear)

HashEntry 中的 value 变量 和 指向下一个节点的引用变量 next 都是使用 volatile 关键字进行修饰的,以此保证有序性和可见性

  • get() 方法不加锁,先找 segemnt 再找 桶
  • put() 方法要加锁,插入之前先判断 count 与阈值的关系,有需要的话则进行扩容处理(桶的容量扩容两倍)

put、remove、replace、clear 操作都要加锁

  • size() 先尝试两次不加锁的统计各个 segment 中的 count,如果结果不一致,则采用对全部 segment 加锁的方式统计

JDK 1.8 中的 ConcurrentHashMap

使用 synchronized 和 volatile 关键字来保证线程安全

取消 segment ,当桶中 链表 长度大于 8 时,将链表转换为 RBTree

  • get()方法不加锁
  • put()方法:

如果桶是空的,则初始化桶,并采用 CAS 操作将元素放在链表的首位

如果桶非空,则通过使用 synchronized 锁住 链表的第一个节点(以此来锁住整个桶),再使用 Unsafe 类的 CAS 操作将元素放在链表的末尾


JDK 1。8 中 ConcurrentHashMap 中使用 synchronized 替代 Segment ,使得锁的粒度更加精细,以此提高程序的性能



标签:1.6,加锁,JDK,1.8,ConcurrentHashMap,链表,put,segment
From: https://blog.51cto.com/u_16152603/6426045

相关文章

  • windows编译freeswitch-1.8.5
    我的windows环境是WIN10编译器是vs2022下载好freeswitch-1.8.5代码解压后直接打开sln文件,开始编译。报错如下:6>libsrtp.lib(crypto_kernel.obj):errorLNK2005:SocketNotificationRetrieveEvents已经在libsrtp.lib(srtp.obj)中定义6>libsrtp.lib(alloc.obj):errorL......
  • 1.6. 数组
    数组是一种数据结构,用于存储相同类型的多个元素。在Java中,数组是一个对象,它具有一定数量的连续内存空间。数组中的每个元素都有一个索引,用于访问和操作元素。1.6.1.数组的声明与初始化在Java中,可以使用以下语法声明一个数组:元素类型[]数组名;要创建一个数组,需要使用 n......
  • OpenOffice4.1.6 linux安装/卸载教程
    以下是centos的安装方法1.先安装并配置好jdk2.拷贝把Apache_OpenOffice_4.1.6_Linux_x86-64_install-rpm_zh-CN.tar.gz拷贝到自己想要文件路径,例:/home/temp3.解压tarzxvfApache_OpenOffice_4.1.6_Linux_x86-64_install-rpm_zh-CN.tar.gz解压后会有一个zh-CN文件夹4.安......
  • 查 101.201.62.30 IP信誉方法
    查101.201.62.30IP信誉方法https://www.virustotal.com/#/ip-address/101.201.62.30https://talosintelligence.com/reputation_center/lookup?search=101.201.62.30https://x.threatbook.cn/ip/101.201.62.30......
  • Linux 下安装JDK1.8-解压版
    一、安装环境操作系统:RedHatEnterpriseLinux664位(版本号6.6)JDK版本:1.8工具:Xshell5、Xftp5说明:本文是通过Xshell5工具远程连接Linux操作,如果是直接在Linux可视化界面操作那就更方便了,原理一样。二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去(官网)中下载jdk的安装......
  • N77007-BJ-DUYIFAN-Week1.6
    用自己的理解总结文件管理,用户管理,组用户,权限管理相关的命令。文件:【touch/rm/rmdir/cat/head/less/more】。用户及组:user/group【useradd/userdel/usermode;groupadd/groupdel/groupmod;chsh/...】。权限【chmod/chown/setfacl】"文件:touch:touch可以和{}合起来用,例......
  • 为什么HashMap可以存null,而ConcurrentHashMap不可以?
    HashMap中,null可以作为键也可以做为值。而在ConcurrentHashMap中,Key和Value都不允许为null。ConcurrentMap(如ConcurrentHashMap、ConcurrentSkipListMap)不允许使用null值的主要原因是,在非并发的Map中(如HashMap),是可以容忍模糊性(二义性)的,而在并发Map中是无法容忍的。假如说,所有的......
  • ConcurrentHashMap
    引言HashMap在我们日常的开发中使用频率最高的一个工具类之一,然而使用HashMap最大的问题之一就是它是线程不安全的,如果我们想要线程安全,这时候就可以选择使用ConcurrentHashMap,ConcurrentHashMap和HashMap的功能是基本一样的,ConcurrentHashMap是HashMap的线程安全版......
  • WPS2019集美大学版v11.8.6.11825
    软件介绍WPSOffice2019增强版(wps集美大学专用版)是一款由大学教育机构定制的WPS企业版,wps2019政府版拥有正版授权,免激活可以长期使用.金山Office办公软件最新wps2019专业增强版wps2019永久激活版下载.软件截图版本特点WPS2019集美大学专用版:免激活、去水印、永久授权、......
  • rnacos v0.1.6版本发布
    rnacos是一个用rust重新实现的nacos。rnacos比java实现的nacos更轻量、快速、稳定;合适在开发、测试、受资限服务等环境平替nacos服务使用。rnacosv0.1.6变更内容完成历史配置历史变更记录页面开发。主要包含查询配置历史记录,与历史记录内容恢复两个功能。修复grpc处理日志......