首页 > 其他分享 >ConcurrentHashMap

ConcurrentHashMap

时间:2024-02-04 14:46:30浏览次数:20  
标签:ConcurrentHashMap 分段 Segment HashEntry 数组 数据

ConcurrentHashMap1.8之前提供了⼀种粒度更细的加锁机制来实现在多线程下更⾼的性
能,这种机制叫分段锁(Lock Striping)。
提供的优点是:在并发环境下将实现更⾼的吞吐量,⽽在单线程环境下只损失⾮常
⼩的性能。
可以这样理解分段锁,就是将数据分段,对每⼀段数据分配⼀把锁。当⼀个线程占
⽤锁访问其中⼀个段数据的时候,其他段的数据也能被其他线程访问。
有些⽅法需要跨段,⽐如size()、isEmpty()、containsValue(),它们可能需要锁定
整个表⽽⽽不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,⼜按顺序释
放所有段的锁。
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment
是⼀种可重⼊锁ReentrantLock,HashEntry则⽤于存储键值对数据。
⼀个ConcurrentHashMap⾥包含⼀个Segment数组,Segment的结构和HashMap
类似,是⼀种数组和链表结构, ⼀个Segment⾥包含⼀个HashEntry数组,每个
HashEntry是⼀个链表结构(同HashMap⼀样,它也会在⻓度达到8的时候转化为
红⿊树)的元素, 每个Segment守护者⼀个HashEntry数组⾥的元素,当对
HashEntry数组的数据进⾏修改时,必须⾸先获得它对应的Segment锁。

标签:ConcurrentHashMap,分段,Segment,HashEntry,数组,数据
From: https://www.cnblogs.com/yyz0225/p/18006128

相关文章

  • ConcurrentHashMap的线程安全
    ConcurrentHashMap是怎么做到线程安全的?   get方法如何线程安全地获取key、value?   put方法如何线程安全地设置key、value?   size方法如果线程安全地获取容器容量?   底层数据结构扩容时如果保证线程安全?   初始化数据结构时如果保证线程安全?ConcurrentHashMap......
  • ConcurrentHashMap是如何实现线程安全的
     但是又为何需要学习ConcurrentHashMap?用不就完事了?我认为学习其源码有两个好处:更灵活的运用ConcurrentHashMap欣赏并发编程大师DougLea的作品,源码中有很多值得我们学习的并发思想,要意识到,线程安全不仅仅只是加锁ConcurrentHashMap是怎么做到线程安全的?   get方法如何线......
  • hashmap线程不安全 ConcurrentHashMap是如何实现线程安全的
       2、JDK1.8中的数据覆盖(1)dk1.7的数据丢失、死循环问题在JDK1.8中已经得到了很好的解决,直接在HashMap的resize()中完成了数据迁移。(2)为什么说JDK1.8会出现数据覆盖的情况?查看这段JDK1.8中的put操作代码:在这里插入图片描述如下图框中的代码是判断是否出现hash碰撞,假设两个......
  • ConcurrentHashMap源码逐行解读基于jdk1.8
    前导知识//node数组最大容量:2^30=1073741824privatestaticfinalintMAXIMUM_CAPACITY=1<<30;//默认初始值,必须是2的幕数privatestaticfinalintDEFAULT_CAPACITY=16;//数组可能最大值,需要与toArray()相关方法关联st......
  • ConcurrentHashMap从入门到入睡
    ConcurrentHashMap为什么使用ConcurrentHashMap前文提到,HashMap无论任何版本都是线程不安全的。但Hashtable会给整张表加悲观锁,仅允许单个线程独占,效率低下。synchronizedMap加入了互斥锁mutex,在方法上加上synchronized,效率同样不高。所以需要更低粒度的锁以换取更好的并......
  • ConcurrentHashMap一直卡住bug
    目录jdk11ConcurrentHashMapbug,会一直卡在这里:"main"#1prio=5tid=0x00007f4bd8029800nid=0xbd75runnable[0x00007f4bde485000]java.lang.Thread.State:RUNNABLEJavaThreadstate:_thread_in_vm_trans-java.util.concurrent.ConcurrentHashMap.trans......
  • ConcurrentHashMap
    jdk1.8之后:syncronized+cashttps://blog.csdn.net/ThinkWon/article/details/102506447syncronized锁加到了链表上cas是没有hash冲突的时候,往数组插入元素时候用的。put元素的时候:首先对于每一个放入的值,首先利用spread方法对key的hashcode进行一次hash计算,由此来确定......
  • 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面试中常常被拿来考察对多线程编程的理解,所以务必认真学习,不仅仅是为了通过面试,更是为了提高自己在多线程编......