请问 java的 ConcurrentHashMap是线程安全的吗?
请问 java的 ConcurrentHashMap forEach是线程安全的吗? https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.htmlctrl+f
"thread" 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 锁。 看情况,
https://zhuanlan.zhihu.com/p/269297764
看看这片文章,评论中的高赞老哥说的很对
页:
[1]