ConcurrentHashMap解析

HashMap的缺点:当多线程环境下,使用HashMap进行put操作的时候可能会出现死循环;导致CPU利用率接近100%如果使用synchronized关键字加锁,但是如果线程竞争很激烈的话,一个线程访问同步方法,其他线程就要进行自旋或者阻塞,效率很低。这个时候就需要线程安全并且效率较高的HashMap:ConcurrentHashMapConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLockHa
摘要由CSDN通过智能技术生成

HashMap的缺点:

  • 当多线程环境下,使用HashMap进行put操作的时候可能会出现死循环;导致CPU利用率接近100%。不过jdk1.8采用了尾插法解决了这个问题;但是会出现数据覆盖问题(主要是两个线程同时调用put方法,而且hash&(length-1)是同一桶位,两个线程同时put就可能造成只有一个线程成功,造成数据覆盖问题)

HashTable的缺点:

  • HashTable在HashMap的基础上使用synchronized关键字加锁,虽然保证了并发的安全,但是相当于串行执行,并且如果线程竞争很激烈的话,一个线程访问同步方法,其他线程就要进行自旋或者阻塞,效率很低。

这个时候就需要线程安全并且效率较高的HashMap:ConcurrentHashMap

JDK1.7ConcurrentHashMap实现:
jdk1.7的ConcurrentHashMap主要是由segment和散列表两个对象维护的;在散列表中放的是Segment对象,而Segment对象其实相当于内部维护的是一个HashMap。在put的时候先找到要放到哪个桶位(Segment对象),然后尝试加锁,在调用Segment里面的put方法往Segment对象里面的HashMap存放。扩容的时候也是只扩容Segment对象里面的HashMap,与其他桶位无关

ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。

  • Segment是一种可重入锁ReentrantLock
  • HashEntry则用于存储键值对数据
    *Segm
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值