Java-关于ConcurrentHashMap的segments分段锁

Java-关于ConcurrentHashMap的segments分段锁

想挽留 发布于 2017-07-30 字数 240 浏览 1157 回复 2

ConcurrentHashMap分段锁segment为什么继承了的ReentrantLock,而不是ReentrantReadWriteLock或者自己实现一套ReadWriteLock,这样做高速并发缓存是不是更好些呢?不解java源码其中深意。另外实现动态管理segment分段锁,有哪些高效方案?请大侠帮帮我

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

想挽留 2017-09-21 2 楼

ConcurrentHashMap 的 get 的操作在大多数情况下都是不加锁的,只有当找到的 HashEntry 的 value 是 null 时,才会再进行一次加锁的读操作,以保障读操作的一致性。通常这种情况发生在你找到的 HashEntry 恰是另一个线程在做 put 操作时创建的,且 value 恰好没有设置完成。这种情况不太容易发生。所以,对于 ConcurrentHashMap 来说,发生在同一个 Segment 的一个写和多个读操作是并不互斥的,所以 Segment 也就没有继承读写锁了,而且这种设计要比读写锁的并发能力更高。

归属感 2017-08-30 1 楼

读写锁只有在读的操作远远多于写的操作的时候才能提高性能,而ConcurrentHashMap的使用比较广泛,就像楼主问题描述中提到的高速并发缓存,如果该缓存用在了网站上,读写的比例不会相差太悬殊,如果用ReadWriteLock的话,当需要读取cache中的数据时,有写操作的话,这时读取数据的动作就被block住了,对于一个拥有大PV量的网站而言是灾难性。