ConcurrentHashMap介绍

在进行结构性修改,如put/remove/replace时都需要进行加锁,但是读取并未加锁,并发情况下,由于内存不同步问题,会导致一个线程的写操作并不会立即对另一个线程可见。这里ConcurrentHashMap通过volatile变量的内存可见性特性来保证一个线程的写操作立即被其他线程可见,每个方法在一开始都会读取count这个变量,该变量就是一个volatile变量,多个线程之间通过读写这个变量来保证内存可见性,具体可参考下方的关于JVM内存可见性的说明。

ConcurrentHashMap首先通过Segment对整个数据集进行切分,并通过对各个部分的数据集进行加锁来提高整个数据集的并发性;通过读写分离的方式实现无锁读,加锁写,进一步提高ConcurrentHashMap的读写效率;并通过volatile变量的特性实现读写的可见性保证。

使用场景

ConcurrentHashMap由于其即使在同步的情况下依旧保证高效的读写性能,所以在很多需要使用HashMap的情况都适用,当然单线程情况并不需要使用同步的ConcurrentHashMap。如果无法保证你的HashMap只是在单线程情况下使用那么就使用ConcurrentHashMap,因为其在单线程情况下的效率也并不低。

下面是针对单线程环境下ConcurrentHashMap和HashMap的put性能的对比:

硬件PC:普通PC机,i5

JVM:内存1G

测试数据:执行10次,计算均值

结果:表格

Map

PUT1W次

PUT10W次

PUT100W次

ConcurrentHashMap

2175317

28068193

1355076232

HashMap

1201131

28068193

407341713

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

volatile实现可见性但不保证原子性

   volatile关键字:能够保证volatile变量的可见性不能保证volatile变量复合操作的原子性         volatile如何实现内存可见性:        深入来说:通过加入内存屏障和禁止重排序优化来实现的。对volatile变量执行写操作时,会在写操作后加入一条store屏

Java并发编程原理与实战十二:深入理解volatile原理与使用

volatile:称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的。可见:一个线程修改了这个变量的值,在另一个线程中能够读取到这个修改后的值。synchronized除了线程之间互斥之外,还有一个非常大的作用,就是保证可见性。以下demo即保证a值的可见性。首先来看demo:!复制代码(https://oscimg.osc

Java多线程(二)

\恢复内容开始一,volatile关键字当多个线程操作共享数据时,可以保证内存中的数据可见性相较于synchronized关键字:1,不具备“互斥性”2,不能保证变量的原子性二,原子变量volatile保证内存可见性CAS(CompareAndSwap)算法保证数据的原子性内存值V预估值A更新值