Hashtable、HashMap和ConcurrentHashMap源码解析、对比

ConcurrentHashMap的简单介绍

Hashtable、HashMap和ConcurrentHashMap源码解析、对比_第1张图片

如图:ConcurrentHashMap是一种哈希表,支持检索的完全并发性和更新的高预期并发性。该类遵循与Hashtable相同的功能规范,并包含与Hashtable的每个方法相对应的方法版本。但是,即使所有操作都是线程安全的,检索操作也不需要锁定,并且不支持以阻止所有访问的方式锁定整个表。这个类在依赖于它的哈希表的程序中完全可以与哈希表互操作。

简单来说:

1.ConcurrentHashMap遵循与Hashtable相同的功能规范,并有与Hashtable的每个方法相对应的方法版本。

2.ConcurrentHashMap实现了线程安全,但是并不像Hashtable,它不是通过synchronized实现的。

 

ConcurrentHashMap和HashMap、Hashtable的异同:

  1. ConcurrentHashMap和HashMap的初始容量是16,与Hashtable不同,它是11。

  2.  ConcurrentHashMap的每个属性都用transientvolatile修饰。而HashMap和Hashtable没有。

  transient 保护属性不被序列化。

  volatile 保护的是变量安全。主要的功能是保护变量不被主函数和中断函数反复修改造成读写错误。

  3.

 HashMap:Hashtable、HashMap和ConcurrentHashMap源码解析、对比_第2张图片

ConcurrentHashMap: Hashtable、HashMap和ConcurrentHashMap源码解析、对比_第3张图片

可以看到ConcurrentHashMap的val和next都被volatitle修饰;value和next指针使用了volatile来保证其可见性。

 

ConcurrentHashMap用到的并发技巧:

  ConcurrentHashMap中就算有多个线程同时进行put操作,在初始化数组时使用了乐观锁CAS操作来决定到底是哪个线程有资格进行初始化,其他线程均只能等待。

  • volatile变量(sizeCtl):它是一个标记位,用来告诉其他线程这个坑位有没有人在,其线程间的可见性由volatile保证。互斥。
  • CAS操作:CAS操作保证了设置sizeCtl标记位的原子性,保证了只有一个线程能设置成功

 

ConcurrentHashMap的动态扩容:

  ConcurrentHashMap支持多线程并发扩容,在扩容过程中同时支持get查数据,若有线程put数据,还会帮助一起扩容。get和put并行处理。

 

你可能感兴趣的:(面试,学习总结)