性能测试
- 使用StopWatch测试两段代码的性能,最后的断言判断Map中元素的个数及所有V的和是否符合预期来校验代码正确性
- 性能测试结果:
- 比使用锁性能提升至少5倍。
computeIfAbsent高性能之道
Java的Unsafe实现的CAS。
它在JVM层确保写入数据的原子性,比加锁效率高:
static final <K,V> boolean casTabAt(Node<K,V>[] tab, int i, Node<K,V> c, Node<K,V> v) { return U.compareAndSetObject(tab, ((long)i << ASHIFT) + ABASE, c, v); }
所以不要以为只要用了ConcurrentHashMap并发工具就是高性能的高并发程序。
使用computeIfAbsent、putIfAbsent
当Key存在的时候,如果Value获取比较昂贵的话,putIfAbsent就白白浪费时间在获取这个昂贵的Value上(这个点特别注意)
Key不存在的时候,putIfAbsent返回null,小心空指针,而computeIfAbsent返回计算后的值
当Key不存在的时候,putIfAbsent允许put null进去,而computeIfAbsent不能,之后进行containsKey查询是有区别的(当然了,此条针对HashMap,ConcurrentHashMap不允许put null value进去)
参考

