ConcurrentHashMap的使用场景以及与HashTable的比较

本文探讨了ConcurrentHashMap的分段锁机制如何在并发环境下提供更高的性能和伸缩性,通过比较与HashTable和synchronizedMap的区别,展示了在需要高并发性能场景下使用ConcurrentHashMap的优势,并提供了具体应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ConcurrentHashMap使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只有一个线程访问容器,而是使用一种粒度更细的加锁机制来实现更大程度的共享,这种机制成为分段锁(lock striping)。这种机制中,任意数量的读取线程都可以并发访问Map,并且一定数量的线程可以并发修改Map。好处是:在并发环境下实现更高的吞吐量。

       在HashTable以及synchronizedMap中,都是通过获取整个Map的锁以防止其他线程访问这个Map,但ConcurrentHashMap没有对整个Map加锁以提供独占访问。

典型应用场景:

使用map时,需要使用synchronized,这样计算的并发性能低下

public class Memoizer1 <A, V> implements Computable<A, V> {
    private final Map<A, V> cache = new HashMap<A, V>();
    private final Computable<A, V> c;

    public Memoizer1(Computable<A, V> c) {
        this.c = c;
    }

    public synchronized V compute(A arg) throws InterruptedException {
        V result = cache.get(arg);
        if (result == null) {
            result = c.compute(arg);
            cache.put(arg, result);
        }
        return result;
    }
}
interface Computable <A, V> {
    V compute(A arg) throws InterruptedException;
}

改成使用ConcurrentHashMap

public class Memoizer2 <A, V> implements Computable<A, V> {
    private final Map<A, V> cache = new ConcurrentHashMap<A, V>();
    private final Computable<A, V> c;

    public Memoizer2(Computable<A, V> c) {
        this.c = c;
    }

    public V compute(A arg) throws InterruptedException {
        V result = cache.get(arg);
        if (result == null) {
            result = c.compute(arg);
            cache.put(arg, result);
        }
        return result;
    }
}

进一步的原理分析和比较,可以参考:

http://blog.youkuaiyun.com/liuzhengkang/article/details/2916620

http://www.douban.com/note/169672949/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值