ConcurrentHashMap总结

为什么要使用ConcurrentHashMap

原因:线程不安全的HashMap,在多线程的情况下,数组扩容时,会导致链表出现死循环问题,导致线程不安全。

解决HashMap链表死循环有三种方法:

1.Collection.synchronized*(m)将线程不安全的集合变为线程安全的结合。里面定义了一个对象锁来保护线程安全,将该对象转换为同步对象,不能改变对象的类型性质。
2.使用HashTable
3.concurrentHashMap采用分段锁的方式来提高并发访问的效率。

但是效率低下的HashTable,HashTable里面使用synchronized来保证线程安全。一个线程在执行同步方法时,其他线程访问HashTable同一个同步方法的时候,会阻塞或者等待,导致效率的低下。访问HashTable的线程都必须竞争同一把锁。.Collection.synchronized*(m)也会将这个集合上锁,并发访问效率低下。

concurrentHashMap的底层实现原理

1.concurrentHashMap底层逻辑时数组+链表实现的。

2.concurrentHashMap的结构:
将整个map分成了n个segment(类似于数据进行字段拆分,水平分表),segment充当锁的角色。segment的最小单元对象为HashEntry。其中每一个HashEntry对象就相当于一个hashmap对象,里面有键值对的值还有指向链表的头指针。concurrentHashMap是一个二级哈希表,每一个segment下面守护了一个HashEntry对象。对HashEntry对象就行并发操作时,必须要获取这个segment的锁。

3.concurrentHashMap其中get()方法的性质:
jdk1.7读操作不加锁,HashEntry里面的value对象是用volite进行修饰的,能够保证读到最新的数据。Get()操作需要进行二次hash值的计算。

4.统计size()的时候,采用不加锁的方法对每个segment元素个数进行两次累加计算,如果两次数据一致,则返回数据,若不一致,给每个segment加锁,再重新计算一次。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值