首页 > 试题广场 >

ConcurrentHashMap的原理是什么?

[问答题]
请你说明一下ConcurrentHashMap的原理?
1. jdk1.7的ConcurrentHashMap想象成是16个线程安全的hashtable拼凑成的hashMap。每次新增一个Key的时候,我们会进行二阶段hash,第一阶段hash定位到这个key属于哪个分段,第二阶段hash把这个key定位到这个分段数组的什么下标,采取这种方式就是它的原理。学习concurrenthashmap我们主要是要观察他的如下几个方法:put,get,remove,resize,size。这边就不多言了,内容比较多,建议大家去看下源码吧,这边注意的一点是get是不加锁的,具体原因可以思考一下【用到了某个关键字】。2. jdk1.8的话抛弃了分段锁的概念,而是采取了cas和synchronized来保证并发安全,synchronized只锁住当前链表或者红黑二叉树的首节点,只要hash不冲突,就不会产生并发,效率很高。
发表于 2019-05-05 15:12:14 回复(0)
更多回答
回答这道题你得注意JDK1.7和1.8对于concurrentHashMap变化很大。
首先先说JDK1.7版本,1.7的思路是分段锁。啥意思呢?
对于共享资源,频繁地多线程会造成线程上下文地切换,怎么尽量避免这个问题了,这边就引入了锁的粒度这个概念,比如就以数组为例,我可以切分数组把一个大数组分成16段,如果多线程分别操作的是不同的段那么就不存在多线程竞争关系也相对线程安全,这就是分段锁。
你可以把1.7的ConcurrentHashMap想象成是16个线程安全的hashtable拼凑成的hashMap。每次新增一个Key的时候,我们会进行二阶段hash,第一阶段hash定位到这个key属于哪个分段,第二阶段hash把这个key定位到这个分段数组的什么下标,采取这种方式就是它的原理。学习concurrenthashmap我们主要是要观察他的如下几个方法:put,get,remove,resize,size。这边就不多言了,内容比较多,建议大家去看下源码吧,这边注意的一点是get是不加锁的,具体原因可以思考一下【用到了某个关键字】。
1.8的话抛弃了分段锁的概念,而是采取了cas和synchronized来保证并发安全,synchronized只锁住当前链表或者红黑二叉树的首节点,只要hash不冲突,就不会产生并发,效率很高。

发表于 2019-04-04 10:44:11 回复(0)

1. jdk1.7的ConcurrentHashMap想象成是16个线程安全的hashtable拼凑成的hashMap。每次新增一个Key的时候,我们会进行二阶段hash,第一阶段hash定位到这个key属于哪个分段,第二阶段hash把这个key定位到这个分段数组的什么下标,采取这种方式就是它的原理。学习concurrenthashmap我们主要是要观察他的如下几个方法:put,get,remove,resize,size。这边就不多言了,内容比较多,建议大家去看下源码吧,这边注意的一点是get是不加锁的,具体原因可以思考一下【用到了某个关键字】。2. jdk1.8的话抛弃了分段锁的概念,而是采取了cas和synchronized来保证并发安全,synchronized只锁住当前链表或者红黑二叉树的首节点,只要hash不冲突,就不会产生并发,效率很高。
发表于 2019-04-28 22:58:20 回复(0)
看到这些只浅尝辄止的答案不免有些失望...
发表于 2019-08-24 11:58:38 回复(2)
jdk1.7中采用Segment + HashEntry的方式进行实现 1.8中是采用Node + CAS + Synchronized来保证并发安全进行实现.
发表于 2019-04-29 18:15:07 回复(0)
jdk1.7中采用Segment + HashEntry的方式进行实现 1.8中是采用Node + CAS + Synchronized来保证并发安全进行实现.
编辑于 2019-03-25 02:25:15 回复(0)