ConcurrentHasMap

出现的原因是因为我们起先使用的是HashMap和HashTable,但是随着并发量的增加,HashMap并没有使用同步,在多线程情况下使用HashMap的时候就会出现并发问题,而HashTable虽然是安全的,但是使用的是synchronized 锁整表操作,这样在性能上将会产生很大的影响。那么如何能设计出一款即安全,在效率上又高的集合呢,这样就有了ConcurrentHashMap的产生。

ConcurrentHashMap采用的是锁分段技术,内部为Segment数组来进行细分,而每个Segment又通过HashEntry数组来进行组装,当进行写操作的时候,只需要对这个key对应的Segment进行加锁操作,加锁同时不会对其他的Segment造成影响。总的Map包含了16个Segment(默认数量),每个Segment内部包含16个HashEntry(默认数量),这样对于这个key所在的Segment加锁的同时,其他15个Segmeng还能正常使用,在性能上有了大大的提升。

同时ConcurrentHashMap只是针对put方法进行了加锁,而对于get方法并没有采用加锁的操作,因为具体的值,在Segment的HashEntry里面是volatile的,基于happens-before(先行发生)原则,对数据的写先行发生于对数据的读,所以再读取的时候获取到的必然是最新的结果。

因为对数组的操作,在主内存和工作内存中,load和use、assgin和store是必然连在一起的,一旦使用(use)发生,那load必先行发生于use之前,use前必然从主内存中加载最新的值到工作内存的变量副本里。而一旦赋值(assgin),必然先行发生于store将值传递给主内存,在write到主内存中去。所以put方式无需加锁也能获取到最新的结果。

size操作是先请求2次的count数量,如果有发生变化,则对put、remove、clean进行加锁,在统计完之后unlock。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值