锁定老帖子 主题:关于FastHashMap
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-11
今天看老大写的代码,发现在缓存对象的时候基本上都使用commons的FastHashMap. google一下发现HashMap vs FastHashMap的文章,感觉很奇怪. 下班后download下来FastHashMap的代码看了一下 commons中FastHashMap类的doc写道: java.util.HashMap类的一种自定义实现,以应付多线程环境中大量只读方法而非改变改变结构的方法的访问. 当以fast模式运行时,只读方法不是线程安全的,而写操作以下面的步骤进行操作 1 克隆当前的数据集合 2 在克隆对象上进行修改 3 用修改过的克隆对象替换原对象 当FastHashMap被初始化的时候,默认是以slow模式运行. 另外该文档强烈建议:如果是以单线程的模式访问hashmap,建议直接使用hashmap而非FastHashMap,以获得 最大的性能.
接下来我们看FastHashMap的代码实现 首先是类定义,类构造器和类属性 public class FastHashMap extends HashMap { protected HashMap map = null; protected boolean fast = false; public FastHashMap() { super(); this.map = new HashMap(); } }
FastHashMap继承于HashMap,存储由HashMap实现的,通过fast来设置是否是以快速模式执行.可以初步认为FashHashMap是HashMap的一个代理. 先看get操作 public Object get(Object key) { if (fast) { return (map.get(key)); } else { synchronized (map) { return (map.get(key)); } } } 默认情况下,对map进行了同步,get方法的实现还是线程安全的. 这是之所以比HashMap类put数据速度慢的原因. 再看put操作 public Object put(Object key, Object value) { if (fast) { synchronized (this) { HashMap temp = (HashMap) map.clone(); Object result = temp.put(key, value); map = temp; return (result); } } else { synchronized (map) { return (map.put(key, value)); } } } 注意到如果是fast模式,map的引用发生了改变,因此这一刻锁定了this,锁定了当前FastHashMap类的实例.这在大量读写方法并发的情况下,执行效率是很低的. 默认情况对map进行了同步,也是线程安全的.
因此总结 FastHashMap在设定fast=true的情况下才是以fast模式运行的 其次 FastHashMap是为了多线程的情况使用的,而hashmap应用于当线程情况.两者根本就不处于同一个应用场景.因此比较也是无意义的. 其次FastHashMap的put方法使用的是整个对象的实例锁,如果写进程很多很容易堵塞,这一点在fasthashmap的官方文档中已经很清楚写道: 写道
* <p>A customized implementation of <code>java.util.HashMap</code> designed
* to operate in a multithreaded environment where the large majority of * method calls are read-only, instead of structural changes. 另外网上那篇HashMap vs FastHashMap的文章,
http://java.ccidnet.com/art/3737/20050520/467851_1.html
做的测试是在slow模式下的FastHashMap和hashmap在单线程访问的情形下,读/取 结果是 写道
Result:
HashMap put 50000 Object using1.021s FastHashMap put 50000 Object using1.221s HashMap get 50000 Object using0.561s FastHashMap get 50000 Object using0.04s 搞不清楚,该作者举这个例子的目的是什么.....
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-09-10
FastHashMap的实现思想有点类似MGA(Multi-Generation-Architect),在修改的时候为当前做一个快照,在快照的基础上进行,不影响其它的读写,最后合并
|
|
返回顶楼 | |
浏览 2153 次