首页 > 其他分享 >ConcurrentHashMap

ConcurrentHashMap

时间:2023-11-24 20:46:06浏览次数:30  
标签:ConcurrentHashMap hash 结点 链表 如果 table 节点

jdk1.8之后:syncronized + cas

https://blog.csdn.net/ThinkWon/article/details/102506447

  • syncronized 锁加到了链表上
  • cas是没有hash冲突的时候,往数组插入元素时候用的。

put元素的时候:

  1. 首先对于每一个放入的值,首先利用spread方法对key的hashcode进行一次hash计算,由此来确定这个值在 table中的位置;
  2. 如果当前table数组还未初始化,先将table数组进行初始化操作;
  3. 如果这个位置是null的,那么使用CAS操作直接放入;
  4. 如果这个位置存在结点,说明发生了hash碰撞,首先判断这个节点的类型。如果该节点fh==MOVED(代表forwardingNode,数组正在进行扩容)的话,说明正在进行扩容;
  5. 如果是链表节点(fh>0),则得到的结点就是hash值相同的节点组成的链表的头节点。需要依次向后遍历确定这个新加入的值所在位置。如果遇到key相同的节点,则只需要覆盖该结点的value值即可。否则依次向后遍历,直到链表尾插入这个结点;
  6. 如果这个节点的类型是TreeBin的话,直接调用红黑树的插入方法进行插入新的节点;
  7. 插入完节点之后再次检查链表长度,如果长度大于8,就把这个链表转换成红黑树;
  8. 对当前容量大小进行检查,如果超过了临界值(实际大小*加载因子)就需要扩容。

标签:ConcurrentHashMap,hash,结点,链表,如果,table,节点
From: https://www.cnblogs.com/guoyu1/p/17854729.html

相关文章

  • HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
    一、HashMap和TreeMap区别1、HashMap是基于散列表实现的,时间复杂度平均能达到O(1)。   TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到O(logn)。2、HashMap、TreeMap都继承AbstractMap抽象类;TreeMap实现SortedMap接口,所以TreeMap是有序的!HashMap是无序的......
  • ConcurrentHashMap的非线程安全使用
    问题业务场景:应用会创建一个<name,id>的Map并缓存,其中key,value会被其他业务模块调用,最终数据落盘到HDFS上。问题:发现一个奇怪的bug:id在Map中的值和业务表中的值有时候对不上,比如在业务表中查到一个id=100,但是在Map中找不到这个值。经过分析定位,发现问题代码在这里:(大概逻辑为,......
  • 【大揭秘】美团面试题:ConcurrentHashMap和Hashtable有什么区别?一文解析!
    正文亲爱的小伙伴们,大家好!我是小米,一个热爱技术分享的程序员,今天我为大家带来了一篇有关美团面试题的热门话题:ConcurrentHashMap和Hashtable有什么区别。这个问题在Java面试中常常被拿来考察对多线程编程的理解,所以务必认真学习,不仅仅是为了通过面试,更是为了提高自己在多线程编......
  • hashmap,arrayList,concurrentHashMap扩容机制
    HashMap1.7和1.8扩容机制在Java1.7中,HashMap的扩容机制是当容量超过负载因子与数组长度的乘积时就会进行扩容。默认负载因子为0.75,即当数组长度为n时,当元素个数size超过n*0.75时就会扩容。扩容时,数组长度会变为原来的2倍,并且将原来的元素重新计算哈希值,再散列到新......
  • 面试官:ConcurrentHashMap 是如何保证线程安全的
    1、前言阅读此篇文章,你需要有以下知识基础Java内存模型,可见性问题CASHashMap底层原理我们知道,在日常开发中使用的HashMap是线程不安全的,而线程安全类HashTable只是简单的在方法上加锁实现线程安全,效率低下,所以在线程安全的环境下我们通常会使用ConcurrentHashMap,但是又为何需要学习......
  • 9张图深入剖析ConcurrentHashMap
    前言在日常的开发中,我们经常使用key-value键值对的HashMap,其使用哈希表实现,用空间换取时间,提升查询性能但在多线程的并发场景中,HashMap并不是线程安全的如果想使用线程安全的,可以使用ConcurrentHashMap、HashTable、Collections.synchronizedMap等但由于后面二者使用synchroniz......
  • 9张图深入剖析ConcurrentHashMap
    前言在日常的开发中,我们经常使用key-value键值对的HashMap,其使用哈希表实现,用空间换取时间,提升查询性能但在多线程的并发场景中,HashMap并不是线程安全的如果想使用线程安全的,可以使用ConcurrentHashMap、HashTable、Collections.synchronizedMap等但由于后面二者使用synchroni......
  • jdk8中的ConcurrentHashMap原理和源码解读
    HashMap本身是线程不安全的,所以jdk提供了ConcurrentHashMap,这一篇来看下jdk8中的实现一、基本原理在jdk7中采用了Segment分段锁的思想来实现,在jdk8中不再采用分段锁的思想,jdk8中的ConcurrentHashMap和HashMap一样,都只有一层Entry数组来实现,那么它是怎么保证线程安全呢,我们通......
  • jdk7中的ConcurrentHashMap原理和源码解读
    HashMap是线程不安全的,所以jdk提供了ConcurrentHashMap这个线程安全的map集合实现,这一篇文章来分析下jdk7中ConcurrentHashMap的实现原理一、分段锁Segmentjdk7中ConcurrentHashMap的实现使用了分段锁的思想。先来思考下Hashtable是一个线程安全的map,但为什么它的效率不高......
  • HashMap 的长度为什么是 2 的 N 次方?HashMap 与 ConcurrentHashMap 的异同
    一、HashMap的长度为什么是2的N次方为了能让HashMap存数据和取数据的效率高,尽可能地减少hash值碰撞,也就是说尽量把数据能平均分配,每个链表或者红黑树长度尽量相等。取余(%)操作中,如果除数是2的幂次,则等价于与其除数减一的与(&)操作。即:hash%length==hash&(length-1),这个等式成......