文档章节

ConcurrentHashMap(JDK1.8)为什么要放弃Segment

那只是一股逆流
 那只是一股逆流
发布于 2017/04/15 16:18
字数 550
阅读 287
收藏 16
点赞 0
评论 3

今天看到一篇博客:jdk1.8的HashMap和ConcurrentHashMap,我想起了前段时间面试的一个问题:ConcurrentHashMap(JDK1.8)为什么要使用synchronized而不是可重入锁?

我想从下面几个角度讨论这个问题:

  1. 锁的粒度 首先锁的粒度并没有变粗,甚至变得更细了。每当扩容一次,ConcurrentHashMap的并发度就扩大一倍。
  2. Hash冲突 JDK1.7中,ConcurrentHashMap从过二次hash的方式(Segment -> HashEntry)能够快速的找到查找的元素。在1.8中通过链表加红黑树的形式弥补了put、get时的性能差距。
  3. 扩容 JDK1.8中,在ConcurrentHashmap进行扩容时,其他线程可以通过检测数组中的节点决定是否对这条链表(红黑树)进行扩容,减小了扩容的粒度,提高了扩容的效率。

下面是我对面试中的那个问题的一下看法:

为什么是synchronized,而不是可重入锁 1. 减少内存开销 假设使用可重入锁来获得同步支持,那么每个节点都需要通过继承AQS来获得同步支持。但并不是每个节点都需要获得同步支持的,只有链表的头节点(红黑树的根节点)需要同步,这无疑带来了巨大内存浪费。 2. 获得JVM的支持 可重入锁毕竟是API这个级别的,后续的性能优化空间很小。 synchronized则是JVM直接支持的,JVM能够在运行时作出相应的优化措施:锁粗化、锁消除、锁自旋等等。这就使得synchronized能够随着JDK版本的升级而不改动代码的前提下获得性能上的提升。


我不能保证写的东西完全正确 但是我能保证我写的东西都是经过思考之后所得出,而不是复制粘贴得来 如果有不对的地方,希望您能够指正,谢谢~

© 著作权归作者所有

共有 人打赏支持
那只是一股逆流
粉丝 9
博文 21
码字总数 25830
作品 0
南岸
后端工程师
加载中

评论(3)

ihuotui
ihuotui

引用来自“依然藏锋”的评论

synchronizied不是也可以锁重入吗?没太理解!
ReentrantLock的锁实现是用aqs,会占用额外空间.
synchronizied是底层的jvm的线程竞争.
那只是一股逆流
那只是一股逆流

引用来自“依然藏锋”的评论

synchronizied不是也可以锁重入吗?没太理解!

回复@依然藏锋 : 可重入是必须的
依然藏锋
synchronizied不是也可以锁重入吗?没太理解!
ConcurrentHashMap源码解析(JDK1.8)

通过HashMap的实现原理可以知道,HashMap在并发情况下的扩容操作,会出现链表造成闭环,导致在get时会出现死循环,因此HashMap是线程不安全的,但是HashMap的实现原理和源码对于学习Concurr...

激情的狼王丶21 ⋅ 02/01 ⋅ 0

Java并发编程总结4——ConcurrentHashMap在jdk1.8中的改进

Java并发编程总结4——ConcurrentHashMap在jdk1.8中的改进 一、简单回顾ConcurrentHashMap在jdk1.7中的设计 先简单看下ConcurrentHashMap类在jdk1.7中的设计,其基本结构如图所示: 每一个s...

tantexian ⋅ 2016/11/22 ⋅ 0

Java集合:Map接口总结

一、HashMap 基于哈希表的 Map 接口的实现,允许存入 null 值和 null 键,无序存储且线程不同步; HashMap 初始容量默认为16,扩容一定是2的指数,加载因子默认值为0.75; HashMap采用Itera...

阿阿阿阿阿局 ⋅ 2016/08/08 ⋅ 0

HashMap,HashTable,ConcurrentHashMap的区别

之前都是JDK1.5,1.6版本的,今天不巧系统升级了。。JavaSE6跟系统不兼容。。只好升级了JDK1.8 然后对比一下,发现各个版本的CurrentHashMap竟然还都不一样。。 这里就对比一下1.8的了。。 ...

Eviltuzki ⋅ 2015/11/02 ⋅ 4

并发十六:并发容器ConcurrentHashMap实现分析

J.U.C中实现Map接口的并容器有ConcurrentHashMap和ConcurrentSkipListMap。 ConcurrentHashMap ConcurrentHashMap是并发容器中锁分拆的一个经典设计。 ConcurrentHashMap 内部布局: Concur...

wangjie2016 ⋅ 04/14 ⋅ 0

ConcurrentHashmap 解析

ConcurrentHashmap(JDK1.7) 总体描述:   concurrentHashmap是为了高并发而实现,内部采用分离锁的设计,有效地避开了热点访问。而对于每个分段,ConcurrentHashmap采用final和内存可见修...

令飞 ⋅ 2015/04/13 ⋅ 6

ConcurrentHashMap总结

并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降...

Hosee ⋅ 2016/05/16 ⋅ 6

ConcurrentHashMap的了解

概述 从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心。 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了...

zh151832 ⋅ 2015/11/03 ⋅ 0

ConcurrentHashMap基于JDK1.8源码剖析

前言 声明,本文用的是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表、红黑树介绍 HashMap就是这么简单【源码剖析】 LinkedHashMap就这么简单【源码...

Java3y ⋅ 04/14 ⋅ 0

集合——Hashtable与ConcurrentHashMap区别

http://www.importnew.com/15845.html ConcurrentHashMap融合了hashtable和hashmap二者的优势。 hashtable是做了同步的,hashmap未考虑同步。所以hashmap在单线程情况下效率较高。hashtable...

亚特兰缇斯 ⋅ 2015/03/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 7分钟前 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 32分钟前 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 59分钟前 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

Confluence 6 从其他备份中恢复数据

一般来说,Confluence 数据库可以从 Administration Console 或者 Confluence Setup Wizard 中进行恢复。 如果你在恢复压缩的 XML 备份的时候遇到了问题,你还是可以对整个站点进行恢复的,如...

honeymose ⋅ 昨天 ⋅ 0

myeclipse10 快速搭建spring boot开发环境(入门)

1.创建一个maven的web项目 注意上面标红的部分记得选上 2.创建的maven目录结构,有缺失的目录可以自己建立目录补充 补充后 这时候一个maven的web项目创建完成 3.配置pom.xml配置文件 <proje...

小海bug ⋅ 昨天 ⋅ 0

nginx.conf

=========================================================================== nginx.conf =========================================================================== user nobody; #......

A__17 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部