笔试&&面试经验thunisoft成长快乐!Java学习笔记

ConcurrentHashMap实现原理

2017-08-26  本文已影响28人  MentallyL

https://www.ibm.com/developerworks/cn/java/j-concurrent/
https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/index.html

总结

ConcurrentHashMap 是一个并发散列映射表的实现,相比于 HashTable 和用同步包装器包装的 HashMap(Collections.synchronizedMap(new HashMap())),ConcurrentHashMap 拥有更高的并发性。

HashTable缺点

在 HashTable 和由同步包装器包装的 HashMap 中,使用一个全局的锁来同步不同线程间的并发访问。同一时间点,只能有一个线程持有锁,也就是说在同一时间点,只能有一个线程能访问容器。这虽然保证多线程间的安全并发访问,但同时也导致对容器的访问变成串行化的了。

在使用锁来协调多线程间并发访问的模式下,减小对锁的竞争可以有效提高并发性。有两种方式可以减小对锁的竞争:

ConcurrentHashMap 的高并发性主要来自于三个方面:

使用分离锁,减小了请求 同一个锁的频率。

通过 HashEntery 对象的不变性及对同一个 Volatile 变量的读 / 写来协调内存可见性,使得 读操作大多数时候不需要加锁就能成功获取到需要的值。由于散列映射表在实际应用中大多数操作都是成功的 读操作,所以 2 和 3 既可以减少请求同一个锁的频率,也可以有效减少持有锁的时间。


通过减小请求同一个锁的频率和尽量减少持有锁的时间 ,使得 ConcurrentHashMap 的并发性相对于 HashTable 和用同步包装器包装的 HashMap有了质的提高。

上一篇下一篇

猜你喜欢

热点阅读