并发下的Map常见问题小结

1、HashMap和HashTable有什么区别?

HashMap是线程不安全的,HashTable是线程安全的;

② 因为线程安全,所以HashTable效率比不上HashMap

③ HashMap最多只允许一条记录的键为null,允许多条记录的值为null;而HashTable不允许;

④ HashMap默认初始化数组的大小为16,HashTable为11,前者扩容时,扩大两倍,后者扩大两倍+1;

⑤ HashMap需要重新计算hash值,而HashTable直接使用对象的hashcode。

2、Java中另一个线程安全的与HashMap极其类似的类是什么?同样是线程安全,ta与HashTable在线程同步上有什么不同?

① ConcurrentHashMap 类(是Java并发包java.util.concurrent中提供的一个线程安全且高效的HashMap实现);                                ConcurrentHashMap 在 JDK1.7中采用分段锁的方式, JDK1.8中直接采用了CAS(无锁算法)+ synchronized,也采用分段锁的方式并大大缩小了锁的粒度。

② HashTable是使用synchronize 关键字加锁的原理(对象锁);

3、HashMap 与 ConcurrentHashMap的区别

① 除了加锁,原理无太大区别

     HashMap的键值对 允许有null,但是ConcurrentHashMap都不允许。

4、为什么ConcurrentHashMap 比 HashTable 效率要高?

① HashTable使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易阻塞;

② ConcurrentHashMap: JDK1.7中使用分段锁(ReentrantLock+Segment+HashEntry),相当于把一个HashMap分成多个段,每段分配一把锁,这样支持多线程访问。锁粒度:基于Segment,包含多个HashEntry。

   JDK1.8 中使用CAS + synchronized + Node + 红黑树锁粒度:Node(首节点)(实现Map。Entry<K,V>),锁粒度降低了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值