对于ConcurrentHashMap 以下简称CHM 大家都非常熟悉,相信在开发中大家会经常 使用,其在1.8以前 使用锁分段技术,将锁的粒度细化。而在java1.8中使用了另外的实现方式,后面在来分析 。使用CHM需要注意的事项。
1)对于单个操作如 put , containsKey, remove 等 是线程安全的,但是组合都来就不一定了。需要注意组合起来使用的情况,而其也提供 了putifAbsent的 组合线程安全的情况。
2) 使用场景 get iterator clear等 都是弱一致性的,虽然性能提高了不少,但是对于数据要求强一致性的应用来说,显然并不适合直接使用CHM. 就需要使用 Hashtable,或者 HashMap , lock synchronized等形式达到数据强一制的效果 。
虽然 在迭代过程中不会抛出异常,比如说当前线程在迭代时,另一个线程是其 进行修改删除或者增加,CHM 会尽量去访问到对Map已做的修改,但这个不能保证。 具体使用时应该考虑 数据一致性 与性能 两者。
http://ifeve.com/concurrenthashmap-weakly-consistent/ 分析弱一致性
http://ifeve.com/numa-aware-r-w-locks/