concurrenthashmap put流程
时间: 2023-10-30 17:22:12 浏览: 117
高薪程序员面试题精讲系列49之说说ConcurrentHashMap#put方法的源码及数。。。.pdf,这是一份不错的文件
ConcurrentHashMap的put流程可以通过分析源码来了解。首先,在执行put操作时,会先判断是否需要进行初始化,也就是判断table是否为null。如果table为null,那么会调用initTable方法进行初始化。初始化的过程包括计算出初始容量,并创建一个大小为初始容量的数组作为哈希表的存储结构。然后,会通过CAS操作将sizeCtl设置为一个负数,表示初始化正在进行中,其他线程在此期间会被阻塞等待初始化完成。
接下来,在插入元素时,首先会计算元素的哈希值,并根据哈希值找到对应的桶(数组中的一个位置)。如果该桶为空,即没有元素,那么直接将元素放入该桶中。如果该桶已经有元素存在,那么需要进行进一步的处理。
如果该桶的元素是一个链表,那么会遍历链表,查找是否已经存在相同key的元素。如果找到了相同key的元素,那么会替换掉旧的value,并返回旧的value。如果没有找到相同key的元素,那么会将新的元素插入到链表的末尾。
如果该桶的元素是一个红黑树,那么会调用红黑树的插入操作来插入新的元素。
同时,插入操作会维护一个计数器,用来记录当前元素的数量。在插入操作完成后,会检查是否需要进行扩容。如果当前元素数量超过了阈值,并且扩容操作没有被其他线程执行,那么会尝试进行扩容。扩容的过程包括创建一个新的更大的数组,并将原来数组中的元素重新计算哈希值并放入新的数组中。
总结起来,ConcurrentHashMap的put流程包括初始化、计算哈希值、插入元素、扩容等步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [JDK1.8 ConcurrentHashMap的一点理解](https://download.csdn.net/download/weixin_38692836/14041206)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [这么回答面试官之--ConcurrentHashMap如何put?](https://blog.csdn.net/Elliot_Elliot/article/details/115585676)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文