首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ConcurrentHashMap线程安全?

就需要用到线程安全容器。 使用了线程安全并发工具,并不代表解决了所有线程安全问题。 ThreadLocalRandom 可将其实例设置到静态变量,在多线程下重用?...我们都知道ConcurrentHashMap是个线程安全哈希表容器,但它仅保证提供原子性读写操作线程安全。...开发人员误以为使用ConcurrentHashMap就不会有线程安全问题,于是不加思索地写出了下面的代码:在每一个线程代码逻辑中先通过size方法拿到当前元素数量,计算ConcurrentHashMap...你往这个篮子装100个桔子操作不是原子性,在别人看来可能会有一个瞬间篮子里有964个桔子,还需要补36个桔子。...如果需要确保需要手动加锁 诸如size、isEmpty和containsValue等聚合方法,在并发下可能会反映ConcurrentHashMap中间状态。

1.2K00

ConcurrentHashMapput方法

计算key哈希值for自旋保证put成功如果没有初始化就初始化table有可能多个线程去调用initTable()方法去初始化,用cas加锁就行了,成功一次就行了通过与哈希取模计算数组下标,如果下标节点为...put进去之后,会对链表长度进行判断,如果链表长度大于等于8,进行扩容或者转化为红黑树链表扩容如果tab长度小于64,则调用tryPresize()方法进行扩容链表扩容本质是16->32,将数组扩容一倍...,然后将老数组数据迁移到新数组如果为空就初始化数组,跟之前initTable()方法一样如果已经是最大容量了,直接返回判断sizeCtl是否小于0,因为只有在扩容中时候sizeCtl才会小于0变成...-1,多线程扩容,高16位表示当前扩容标记,保证唯一性,低16位表示当前扩容线程数量,每增加一个扩容线程,就会在低16位+1实现数据转移 transfer()计算每个线程处理数据区间大小,默认最小是...ConcurrentHashMap里面也有死循环,作者留下“彩蛋”了解一下? - 掘金这道面试题我真不知道面试官想要回答是什么

69610
您找到你想要的搜索结果了吗?
是的
没有找到

ConcurrentHashMapsize方法线程安全

前言 之前在面试过程中有被问到,ConcurrentHashMapsize方法线程安全? 这个问题,确实没有答好。这次来根据源码来了解一下,具体是怎么一个实现过程。...但是这中数据结构在实现HashMap时候并不是线程安全,因为在HashMap扩容时候,是会将原先链表迁移至新链表数组中,在迁移过程中多线程情况下会有造成链表死循环情况(JDK1.7之前头插法...Hashtable实现线程安全代价比较大,那就是在所有可能产生竞争方法里都加上了synchronized,这样就会导致,当出现竞争时候只有一个线程能对整个Hashtable进行操作,其他所有线程都需要阻塞等待当前获取到锁线程执行完成...JDK1.8中ConcurrentHashMap在执行put()方法时候还是有些复杂,主要是为了保证线程安全才做了一系列措施。 源码如下: ? 第一步通过key进行hash。...总结 无论是JDK1.7还是JDK1.8中,ConcurrentHashMapsize()方法都是线程安全,都是准确计算出实际数量,但是这个数据在并发场景下是随时都在变

1.6K20

面试阿里被质问:ConcurrentHashMap线程安全

使用了线程安全并发工具,并不代表解决了所有线程安全问题。 ThreadLocalRandom 可将其实例设置到静态变量,在多线程下重用?...我们都知道ConcurrentHashMap是个线程安全哈希表容器,但它仅保证提供原子性读写操作线程安全。...开发人员误以为使用ConcurrentHashMap就不会有线程安全问题,于是不加思索地写出了下面的代码:在每一个线程代码逻辑中先通过size方法拿到当前元素数量,计算ConcurrentHashMap...你往这个篮子装100个桔子操作不是原子性,在别人看来可能会有一个瞬间篮子里有964个桔子,还需要补36个桔子。...如果需要确保需要手动加锁 诸如size、isEmpty和containsValue等聚合方法,在并发下可能会反映ConcurrentHashMap中间状态。

88030

为什么ConcurrentHashMap线程安全

而这些问题,只要使用 ConcurrentHashMap 就可以完美解决了,那问题来了,ConcurrentHashMap 是如何保证线程安全?它底层又是如何实现?接下来我们一起来看。...: JDK 1.7 线程安全实现 了解了 ConcurrentHashMap 底层实现,再看它线程安全实现就比较简单了。...接下来,我们通过添加元素 put 方法,来看 JDK 1.7 中 ConcurrentHashMap 是如何保证线程安全,具体实现源码如下: final V put(K key, int hash,...,这样就能保证多个线程同时访问 ConcurrentHashMap 时,同一时间只有一个线程能操作相应节点,这样就保证了 ConcurrentHashMap 线程安全了。...JDK 1.8 线程安全实现 在 JDK 1.8 中 ConcurrentHashMap 使用是 CAS + volatile 或 synchronized 方式来保证线程安全,它核心实现源码如下

81430

ConcurrentHashMap是如何实现线程安全

ConcurrentHashMap是如何实现线程安全 文章目录 ConcurrentHashMap是如何实现线程安全 前言 相关概念 Amdahl定律 初始化数据结构时线程安全 总结...put操作线程安全 总结 扩容操作线程安全 扩容时get操作 多线程协助扩容 在什么情况下会进行扩容操作?...get方法如何线程安全地获取key、value? put方法如何线程安全地设置key、value? size方法如果线程安全地获取容器容量? 底层数据结构扩容时如果保证线程安全?...同时直接锁住头节点,保证了线程安全 UnsafegetObjectVolatile方法:此方法确保获取到值为最新 扩容操作线程安全 在扩容时,ConcurrentHashMap支持多线程并发扩容,...统计容器大小线程安全 ConcurrentHashMap在每次put操作之后都会调用addCount方法,此方法用于统计容器大小且检测容器大小是否达到阈值,若达到阈值需要进行扩容操作,这在上面也是有提到

50010

ConcurrentHashMap是如何保证线程安全

而这些问题,只要使用ConcurrentHashMap就可以完美地解决。那问题来到了,ConcurrentHashMap它是如何保证线程安全呢?...了解了ConcurrentHashMap基本结构设计,我们再来看它线程安全实现,就比较简单了。 接下来我们来对照JDK1.7中ConcurrentHashMapput()方法源码实现。...ConcurrentHashMap线程安全。...也就是说ConcurrentHashMap线程安全是建立在Segment加锁基础上,所以,我们称它为分段锁或者片段锁,如图中所示。 那JDK1.8又是如何实现呢?...这样就能保证并发访问时线程安全了。 如果把上面的执行用一句话归纳的话,就相当于是ConcurrentHashMap通过对头结点加锁来保证线程安全

48910

面试阿里被P8质问:ConcurrentHashMap真的线程安全

或者使用写时复制CopyOnWriteArrayList,性能更佳呀!技术言论虽然自由,但面对魔鬼面试官时,我们更在乎是这些真的正确? 2 ConcurrentHashMap真的安全?...我们都知道ConcurrentHashMap是个线程安全哈希表容器,但它仅保证提供原子性读写操作线程安全。...开发人员误以为使用ConcurrentHashMap就不会有线程安全问题,于是不加思索地写出了下面的代码:在每一个线程代码逻辑中先通过size方法拿到当前元素数量,计算ConcurrentHashMap...你往这个篮子装100个桔子操作不是原子性,在别人看来可能会有一个瞬间篮子里有964个桔子,还需要补36个桔子。...如果需要确保需要手动加锁 诸如size、isEmpty和containsValue等聚合方法,在并发下可能会反映ConcurrentHashMap中间状态。

92532

如何保证容器是线程安全ConcurrentHashMap 如何高效线程安全

如何保证容器是线程安全ConcurrentHashMap 如何高效线程安全? Java提供了不同层面的线程安全支持。...如何保证线程安全 首先要保障线程安全几个基本特性, 原子性,可见性,有序性。其次可以通过封装方式将内部对象保护起来,保证变量对象不可变性,一般就线程安全了。...理解基本线程安全工具 理解传统集合矿建并发变成中 Map 存在问题,清楚简单同步方式不足 梳理并发包内,尤其是 ConcurrentHashMap 采取了哪些方法来提高并发表现。...最好能够掌握 ConcurrentHashMap 自身演进,目前很多分析资料还是基于早期版本。 为什么需要 ConcurrentHashMap Hashtable 是怎样实现线程安全。...Hashtable 能够保证线程安全,但是它基本就是将 put ,get ,size 等各种操作加上 synchronized, 这样就导致了所有并发操作都要竞争一把锁,一个线程在进行同步操作时,其他线程只能等待

1.1K30

如何保证集合是线程安全? ConcurrentHashMap如何实现高效地线程安全

先前介绍了 Java 集合框架 典型容器类,它们绝大部分都不是线程安全,仅有的线程安全实现,比如 Vector、Stack,在性能方面也远不尽如人意。...ConcurrentHashMap 如何实现高效地线程安全? 典型回答 Java 提供了不同层面的线程安全支持。...为什么需要 ConcurrentHashMap? Hashtable 本身比较低效,因为它实现基本就是将 put、get、size 等各种方法加上“synchronized”。...我们都知道HashMap 不是线程安全,并发情况会导致类似 CPU 占用 100% 等一些问题,那么能不能利用 Collections 提供同步包装器来解决问题呢?...Segment,然后进行线程安全 put 操作: public V put(K key, V value) { Segment s; if (value == null

55030

如何保证集合是线程安全? ConcurrentHashMap如何实现高效地线程安全

我在之前两讲介绍了Java集合框架典型容器类,它们绝大部分都不是线程安全,仅有的线程安全实现,比如Vector、Stack,在性能方面也远不尽如人意。...今天我要问你问题是,如何保证容器是线程安全ConcurrentHashMap如何实现高效地线程安全?典型回答Java提供了不同层面的线程安全支持。...前面已经提过HashMap不是线程安全,并发情况会导致类似CPU占用100%等一些问题,那么能不能利用Collections提供同步包装器来解决问题呢?...private satic class SynchronizedMap 如何保证集合是线程安全? ConcurrentHashMap如何实现高效地线程安全?...= null) { //省略 } return null; }而对于put操作,首先是通过二次哈希避免哈希冲突,然后以Unsafe调用方式,直接获取相应Segment,然后进行线程安全put操作:

42420

【67期】谈谈ConcurrentHashMap是如何保证线程安全

来自:www.cnblogs.com/keeya/p/9632958.html 我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全,当你看到源码get操作时,会发现get...//eh=-2,说明该节点是一个TreeBin,此时调用TreeBinfind方法遍历红黑树,由于红黑树有可能正在旋转变色,所以find里会有读写锁。...是如何保证读到数据不是脏数据呢?...普通共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定,当其他线程去读取时,此时内存中可能还是原来旧值,因此无法保证可见性。...其实就是为了使得Node数组在扩容时候对其他线程具有可见性而加volatile 总结 在1.8中ConcurrentHashMapget操作全程不需要加锁,这也是它比其他并发集合比如hashtable

1.3K30

为什么 StringBuilder 不是线程安全

我:StringBuilder不是线程安全,StringBuffer是线程安全 面试官:那StringBuilder不安全点在哪儿? 我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全,StringBuffer是线程安全这个结论,至于StringBuilder为什么不安全从来没有去想过。...假设这个时候count值为10,len值为1,两个线程同时执行到了第七行,拿到count值都是10,执行完加法运算后将结果赋值给count,所以两个线程执行完后count值为11,而不是12。...这个时候线程1cpu时间片用完了,线程2继续执行。线程2执行完整个append()方法后count变成6了。 ?...那么StringBuffer用什么手段保证线程安全?这个问题你点进StringBufferappend()方法里面就知道了。

55920

为什么 StringBuilder 不是线程安全

我:StringBuilder不是线程安全,StringBuffer是线程安全 面试官:那StringBuilder不安全点在哪儿? 我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全,StringBuffer是线程安全这个结论,至于StringBuilder为什么不安全从来没有去想过。...假设这个时候count值为10,len值为1,两个线程同时执行到了第七行,拿到count值都是10,执行完加法运算后将结果赋值给count,所以两个线程执行完后count值为11,而不是12。...这个时候线程1cpu时间片用完了,线程2继续执行。线程2执行完整个append()方法后count变成6了。...那么StringBuffer用什么手段保证线程安全?这个问题你点进StringBufferappend()方法里面就知道了。 - END -

58120

bihash并不是线程安全

近期在vpp-dev订阅邮箱中有一个关于bihash在查询过程中返回value数值为-1,导致在后续使用中产生崩溃。所以认为bihash并不是线程安全。下面就一起来看一下邮件内容。...为此详细研究了bihash并提出了自己解决方案: bihash线程安全原因 bihash表中桶数永远不会改变。每个桶都有一个锁位。...没有什么可以阻止更新程序更改读者当前正在查看数据,甚至可以立即删除hash数据。此处是否可以正确工作判定方法是我们是否可以对查找和更新操作相对性能进行假设。...请注意,检查键和获取值不是原子,因此如果我们在中间被抢占,结果可能是假。...关于 isolcpus,目前这是作为优化而不是先决条件提出。如果没有 isolcpus,线程可能会被抢占任意长时间。这意味着无论我们为版本字段分配多少位,有时它们都不够。

79450

为什么 StringBuilder 不是线程安全

我:StringBuilder 不是线程安全,StringBuffer 是线程安全 面试官:那 StringBuilder 不安全点在哪儿? 我:。。。...(哑巴了) ❞ 在这之前我只记住了 StringBuilder 不是线程安全,StringBuffer 是线程安全这个结论,至于 StringBuilder 为什么不安全从来没有去想过。...StringBuilder线程安全 我们看到输出了“9326”,小于预期 10000,并且还抛出了一个 ArrayIndexOutOfBoundsException 异常(异常不是必现)。...那么 StringBuffer 用什么手段保证线程安全?这个问题你点进 StringBuffer append()方法里面就知道了。 当然是输出 10000 啦!...那么 StringBuffer 用什么手段保证线程安全?这个问题你点进 StringBuffer append()方法里面就知道了。

35320

为什么 StringBuilder 不是线程安全

我:StringBuilder不是线程安全,StringBuffer是线程安全 面试官:那StringBuilder不安全点在哪儿?我:。。。...(哑巴了) 在这之前我只记住了StringBuilder不是线程安全,StringBuffer是线程安全这个结论,至于StringBuilder为什么不安全从来没有去想过。...假设现在有两个线程同时执行了StringBuilderappend()方法,两个线程都执行完了第五行ensureCapacityInternal()方法,此刻count=5。 ?...这个时候线程1cpu时间片用完了,线程2继续执行。线程2执行完整个append()方法后count变成6了 ?...那么StringBuffer用什么手段保证线程安全?这个问题你点进StringBufferappend()方法里面就知道了。 END

51230
领券