吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 594|回复: 3
收起左侧

[求助] 请问 java的 ConcurrentHashMap是线程安全的吗?

[复制链接]
ppgjx 发表于 2022-11-12 20:36
请问 java的 ConcurrentHashMap forEach是线程安全的吗?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

smldhz 发表于 2022-11-12 21:21
prf8888 发表于 2022-11-12 23:08
ConcurrentHashMap 所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段
数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线
程访问。有些方法需要跨段,比如 size()和 containsValue(),它们可能需要锁定整个表而而不
仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按
顺序”是很重要的,否则极有可能出现死锁,在 ConcurrentHashMap 内部,段数组是 final 的,
并且其成员变量实际上也是 final 的,但是,仅仅是将数组声明为 final 的并不保证数组成员
也是 final 的,这需要实现上的保证。这可以确保不会出现死锁,因为获得锁的顺序是固定
的。
ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。Segment 是一种可
重入锁 ReentrantLock,在 ConcurrentHashMap 里扮演锁的角色,HashEntry 则用于存储键值
对数据。一个 ConcurrentHashMap 里包含一个 Segment 数组,Segment 的结构和 HashMap
类似,是一种数组和链表结构, 一个 Segment 里包含一个 HashEntry 数组,每个 HashEntry
是一个链表结构的元素,每个 Segment 守护者一个 HashEntry 数组里的元素,当对 HashEntry
数组的数据进行修改时,必须首先获得它对应的 Segment 锁。
zlmsx 发表于 2022-11-13 09:57
看情况,
https://zhuanlan.zhihu.com/p/269297764
看看这片文章,评论中的高赞老哥说的很对
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 05:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表