博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试连环炮系列(九):为什么ConcurrentHashMap是线程安全的
阅读量:4448 次
发布时间:2019-06-07

本文共 887 字,大约阅读时间需要 2 分钟。

  1. 为什么ConcurrentHashMap是线程安全的

    JDK1.7中,ConcurrentHashMap使用的锁分段技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

  2. 那说说JDK1.7中Segment的原理

    刚刚说的一段一段就是指Segment,它继承了ReentrantLock,具备锁和释放锁的功能。ConcurrentHashMap只有16个Segment,并且不会扩容,最多可以支持16个线程并发写。

  3. JDK1.8的ConcurrentHashMap怎么实现线程安全的

    JDK1.8放弃了锁分段的做法,采用CAS和synchronized方式处理并发。以put操作为例,CAS方式确定key的数组下标,synchronized保证链表节点的同步效果。

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

    HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为多个线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用put方法添加元素,并且也不能使用get方法来获取元素,所以竞争越激烈效率越低。

参考(部分摘抄的文字版权属于原作者):

鸡汤:上帝为你关上了一扇门,然后去洗洗睡了。

转载于:https://www.cnblogs.com/xiaoyangjia/p/11598094.html

你可能感兴趣的文章
性能测试的概念、指标
查看>>
详细解释
查看>>
LeetCode7 反转整数
查看>>
final与static
查看>>
浅谈集成吊顶终端促销活动之如何借势?
查看>>
集成吊顶业应倡导良性竞争
查看>>
hdu-1133
查看>>
过滤字符串中非法字符
查看>>
Asp.net中使用log4Net的配置
查看>>
JQuery ajax 异步传一个数组到 .net后台
查看>>
STM32学习之路-点亮LED
查看>>
fortran与c
查看>>
pymysql_mysql密码重置方法,连接局域网数据库的解决办法
查看>>
asp.net 事务处理小结
查看>>
java反射学习个人随笔
查看>>
Linux之crontab
查看>>
pycharm-.db文件打不开问题
查看>>
Win7_自动播放
查看>>
随机数
查看>>
丶使用 checked 关键字处理 溢出 错误信息
查看>>