ConcurrentHashMap 1.7 和1.8分别怎么加锁的?

ConcurrentHashMap 在 Java 1.7 和 1.8 中采用了不同的机制来实现并发安全的操作。

在 Java 1.7 中,ConcurrentHashMap 使用了分段锁(Segment Locking)的机制,即将整个 Map 分成多个 Segment,并为每个 Segment 都分配一个独立的锁。这意味着在多线程场景下,每个 Segment 的操作可以并发进行,只有对同一个 Segment 的操作才需要获取锁。

下面是 Java 1.7 中 ConcurrentHashMap 加锁的简化示意:

class ConcurrentHashMap<K, V> {
    private Segment<K, V>[] segments;

    private static class Segment<K, V> {
        private ReentrantLock lock = new ReentrantLock();

        void put(K key, V value) {
            lock.lock();
            try {
                // 更新操作
            } finally {
                lock.unlock();
            }
        }

        V get(K key) {
            lock.lock();
            try {
                // 读取操作
            } finally {
                lock.unlock();
            }
        }

        // 其他操作方法
    }
}

Java 1.8 中对 ConcurrentHashMap 进行了一些改进,引入了一种称为 CAS-based Segment 锁的机制。在 Java 1.8 中,ConcurrentHashMap 的实现中使用了一种基于 CAS(Compare and Swap)的乐观锁策略,取代了早期版本中的分段锁。这种机制在处理并发操作时可以减少锁的竞争,提高并发性能。

由于 Java 1.8 中 ConcurrentHashMap 使用了 CAS-based Segment 锁的机制,因此其底层实现和加锁方式与 Java 1.7 中的分段锁有较大不同。然而,细节是由 Java 平台实现和不同版本的具体实现决定的,因此具体的实现细节可能会有所不同。

总的来说,Java 1.7 中的 ConcurrentHashMap 使用了分段锁(Segment Locking),而 Java 1.8 中使用了扩展的 CAS-based Segment 锁机制来实现并发安全的操作。

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值