本文介绍: 和HashMap一样,是一个存放键值对的容器。使用hash算法来获取值的地址,因此时间复杂度是O(1)。查询非常快。同时,是线程安全的HashMap。专门用于多线程环境。做插入操作时,首先进入乐观锁,然后,在乐观锁中判断容器是否初始化,如果没初始化则初始化容器,如果已经初始化,则判断该hash位置的节点是否为空,如果为空,则通过CAS操作进行插入。如果该节点不为空,再判断容器是否在扩容中,如果在扩容,则帮助其扩容。如果没有扩容,则进行最后一步,先加锁,然后找到hash。……
一、什么是ConcurrentHashMap
ConcurrentHashMap
和HashMap
一样,是一个存放键值对的容器。使用hash
算法来获取值的地址,因此时间复杂度是O(1)。查询非常快。
同时,ConcurrentHashMap
是线程安全的HashMap
。专门用于多线程环境。
二、ConcurrentHashMap和HashMap以及Hashtable的区别
2.1 HashMap
HashMap
是线程不安全的,因为HashMap
中操作都没有加锁,因此在多线程环境下会导致数据覆盖之类的问题,所以,在多线程中使用HashMap
是会抛出异常的。
2.2 HashTable
HashTable
是线程安全的,但是HashTable
只是单纯的在put()
方法上加上synchronized
。保证插入时阻塞其他线程的插入操作。虽然安全,但因为设计简单,所以性能低下。
2.3 ConcurrentHashMap
ConcurrentHashMap
是线程安全的,ConcurrentHashMap
并非锁住整个方法,而是通过原子操作和局部加锁的方法保证了多线程的线程安全,且尽可能减少了性能损耗。
三、ConcurrentHashMap原理
这一节专门介绍ConcurrentHashMap
是如何保证线程安全的。如果想详细了解ConcurrentHashMap
的数据结构,请参考HashMap
。
3.1 volatile修饰的节点数组
3.2 ConcurrentHashMap的put()方法
CAS(Compare-And-Swap):比较并交换
总结
3.3 ConcurrentHashMap的get()方法
四、使用场景
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。