当前位置: 代码迷 >> 综合 >> 为什么Vector、HasTable是线程安全的?ConcurrentHashMap 分段锁?
  详细解决方案

为什么Vector、HasTable是线程安全的?ConcurrentHashMap 分段锁?

热度:70   发布时间:2023-11-02 05:06:44.0

Vector源码

add方法:

get方法:

 

HashTable源码类

put方法:

get方法:

他们都有一个共同点都加了同步函数,来保证线程安全

因为HashTable的读写都是同步的,所以多线程效率非常低,jdk1.5后出现了他的替代品

ConcurrentHashMap 分段锁

ConcurrentHashMap,它内部细分了若干个小的 HashMap,称之为段(Segment)。 默认情况下一个 ConcurrentHashMap 被进一步细分为 16 个段,既就是锁的并发度。
如果需要在 ConcurrentHashMap 中添加一个新的表项,并不是将整个 HashMap 加锁,而是首先根据 hashcode 得到该表项应该存放在哪个段中,然后对该段加锁,并完成 put 操作。在多线程环境中,如果多个线程同时进行 put操作,只要被加入的表项不存放在同一个段中,则线程间可以做到真正的并行。

ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成

ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。 Segment 是一种可重入锁 ReentrantLock,在 ConcurrentHashMap 里扮演锁的角色, HashEntry 则用于存储键值对数据。一个 ConcurrentHashMap 里包含一个 Segment 数组, Segment 的结构和 HashMap类似,是一种数组和链表结构, 一个 Segment 里包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素, 每个 Segment 守护一个 HashEntry 数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得它对应的 Segment 锁。