ConcurrentHashMap的使用
缓存的使用
- 高性能本地缓存:对系统中常用到的业务数据放到缓存中以提高系统性能,限制是单服务器模式
- 分布式缓存:常用分布式缓存技术memcached、redis等
ConcurrentHashMap就是常用的高并发下的缓存对象。
接下来直接上例子:
concurrentMap2的执行结果
Thread-0 start ….
Thread-2 start ….
Thread-4 start ….
Thread-1 start ….
Thread-3 start ….
Thread-4 compute , index================== 0
Thread-0 compute , index================== 2
Thread-0 end …. dataTest0
Thread-2 compute , index================== 1
Thread-2 end …. dataTest0
Thread-4 end …. dataTest0
Thread-3 compute , index================== 3
Thread-1 compute , index================== 4
Thread-1 end …. dataTest3
Thread-3 end …. dataTest3
可以看到put方法被重复执行….
concurrentMap的执行结果
Thread-1 start ….
Thread-3 start ….
Thread-0 start ….
Thread-2 start ….
Thread-4 start ….
end ===========
end ===========
end ===========
end ===========
Thread-1 compute , index=============== 0
Thread-3 end ….====== 456789123
Thread-3 end …. 456789123
end ===========
Thread-1 end ….====== 456789123
Thread-1 end …. 456789123
Thread-0 end ….====== 456789123
Thread-0 end …. 456789123
Thread-2 end ….====== 456789123
Thread-2 end …. 456789123
Thread-4 end ….====== 456789123
Thread-4 end …. 456789123
可以看到put运算只执行一次….
总结:
- 如果缓存对象可以在系统启动时进行初始化加载,可以不使用ConcurrentHashMap
- 如果缓存在put时计算比较复杂,那么推荐直接使用concurrentMap写法
- ConcurrentHashMap缺陷就是缓存无法回收,导致内存溢出问题。此问题在google发布Guava的Cache很好的进行了处理,可查看另一篇文章Guava Cache的使用