当前位置: 移动技术网 > IT编程>开发语言>Java > 面试连环炮系列(九):为什么ConcurrentHashMap是线程安全的

面试连环炮系列(九):为什么ConcurrentHashMap是线程安全的

2019年09月27日  | 移动技术网IT编程  | 我要评论
  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方法来获取元素,所以竞争越激烈效率越低。

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



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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网