并发下的Map常见面试题

本文对比HashMap与线程安全的HashTable,讨论它们在线程同步上的差异,重点讲解ConcurrentHashMap的锁机制升级,以及为何ConcurrentHashMap在JDK1.8中效率更高。
摘要由CSDN通过智能技术生成
  1.  HashMap 和 HashTable 有什么区别?
  2. java中的另一个线程安全的与HashMap极其类似的类是什么?同样是线程安全,它与HashTable在线程同步上有什么不同?
  3. HashMap 与 ConcurrentHashMap的区别?
  4. 为什么 ConcurrentHashMap 比 HashTable效率高?
  5. 针对 ConcurrentHashMap 锁机制具体分析(JDK1.7 vs JDK1.8)?
  6. ConcurrentHashMap 在1.8中,为什么要使用内置锁 synchronized 来代替重入锁 ReetrantLock?
  7. ConcurrentHashMap 简单介绍?
  8. ConcurrentHashMap 的并发度是多少?

1. 答:(1)HashMap 是线程不安全的,HashTable 是线程安全的。

(2)由于线程安全,所以HashTable 效率比不上 HashMap。

(3)HashMap 最多只允许一条记录的键为null,允许多条记录的值为null,而HashTable不允许。

(4)HashMap 的默许初始化数组的大小是16,HashTable 是11,前者扩容时扩大两倍,后者扩大两倍+1;

(5)HashMap 需要重新计算hash值,而HashTable 直接使用对象的hashCode.

2. 答:ConcurrentHashMap类。HashTable 是使用synchronized关键字加锁的原理(就是对对象加锁);而针对ConcurrentHashMap,在JDK1.7中采用分段锁的方式,在JDK1.8中直接采用了CAS(无锁算法)+synchronized,也采用分段锁的方式并大大缩小了锁的粒度。

3. 答:除了加锁,原理上没有太大的区别。另外,HashMap 的键值允许为null,但是ConcurrentHashMap 都不允许。

4. 答:HashTable使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易阻塞。ConcurrentHashMap在1.7中使用分段锁(ReentrantLock + segment + HashEntry),相当于把一个HashMap分成多个段,每段都分一把锁,这样支持多线程访问。锁粒度:基于segment,包含多个HashEntry。在1.8中使用CAS+synchronized+Node+红黑树。锁力度:Node。锁力度降低了。

5. 答:

6. 答:

 

7. 答:

8.  答:

​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值