ConCurrentHashMap的底层是:散列表+红黑树,与HashMap是同样的。(不容许key和value是null值)算法

- JDK1.8底层是散列表+红黑树
- ConCurrentHashMap支持高并发的访问和更新,它是线程安全的
- 检索操做不用加锁,get方法是非阻塞的
- key和value都不容许为null
-
有了Hashtable为啥须要ConCurrentHashMap
- Hashtable是在每一个方法上都加上了Synchronized完成同步,效率低下。
- ConcurrentHashMap经过在部分加锁和利用CAS算法来实现同步。
-
CAS算法和volatile简单介绍
在看ConCurrentHashMap源码以前,咱们来简单讲讲CAS算法和volatile关键字数组
CAS(比较与交换,Compare and swap) 是一种有名的无锁算法安全
CAS有3个操做数并发
当且仅当预期值A和内存值V相同时,将内存值V修改成B,不然什么都不作高并发
- 当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值(A和内存值V相同时,将内存值V修改成B),而其它线程都失败,失败的线程并不会被挂起,而是被告知此次竞争中失败,并能够再次尝试(不然什么都不作)
看了上面的描述应该就很容易理解了,先比较是否相等,若是相等则替换(CAS算法).net
- volatile经典总结:volatile仅仅用来保证该变量对全部线程的可见性,但不保证原子性
- 小结:
-
- 底层结构是散列表(数组+链表)+红黑树,这一点和HashMap是同样的。
- Hashtable是将全部的方法进行同步,效率低下。而ConcurrentHashMap做为一个高并发的容器,它是经过部分锁定+CAS算法来进行实现线程安全的。CAS算法也能够认为是乐观锁的一种~
- 在高并发环境下,统计数据(计算size...等等)实际上是无心义的,由于在下一时刻size值就变化了。
- get方法是非阻塞,无锁的。重写Node类,经过volatile修饰next来实现每次获取都是最新设置的值
- ConcurrentHashMap的key和Value都不能为null
- 详解参考:https://blog.csdn.net/u010723709/article/details/48007881