`
michales003
  • 浏览: 403222 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

关于FastHashMap...

    博客分类:
  • J2EE
阅读更多

今天在开发过程中碰到了一处使用了beanutil中的fasthashmap.在网上查询对比了两者的区别。总算是弄明白了。

 

 发现在缓存对象的时候基本上都使用commons的FastHashMap.

google一下发现HashMap vs FastHashMap的文章,感觉很奇怪.


下班后download下来FastHashMap的代码看了一下

commons中FastHashMap类的doc写道:

java.util.HashMap类的一种自定义实现,以应付多线程环境中大量只读方法而非改变改变结构的方法的访问.

当以fast模式运行时,只读方法不是线程安全的,而写操作以下面的步骤进行操作

1 克隆当前的数据集合

2 在克隆对象上进行修改

3 用修改过的克隆对象替换原对象

当FastHashMap被初始化的时候,默认是以slow模式运行.

另外该文档强烈建议:如果是以单线程的模式访问hashmap,建议直接使用hashmap而非FastHashMap,以获得

最大的性能.

 

接下来我们看FastHashMap的代码实现

首先是类定义,类构造器和类属性

Java代码 复制代码
  1. public class FastHashMap extends HashMap {   
  2.     protected HashMap map = null;   
  3.     protected boolean fast = false;       
  4.     public FastHashMap() {   
  5.             super();   
  6.             this.map = new HashMap();   
  7.         }   
  8. }    
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操作

Java代码 复制代码
  1. public Object get(Object key) {   
  2.         if (fast) {   
  3.             return (map.get(key));   
  4.         } else {   
  5.             synchronized (map) {   
  6.                 return (map.get(key));   
  7.             }   
  8.         }   
  9.     }  
public Object get(Object key) {
        if (fast) {
            return (map.get(key));
        } else {
            synchronized (map) {
                return (map.get(key));
            }
        }
    }

 

默认情况下,对map进行了同步,get方法的实现还是线程安全的.

这是之所以比HashMap类put数据速度慢的原因.

再看put操作

Java代码 复制代码
  1. public Object put(Object key, Object value) {   
  2.         if (fast) {   
  3.             synchronized (this) {   
  4.                 HashMap temp = (HashMap) map.clone();   
  5.                 Object result = temp.put(key, value);   
  6.                 map = temp;   
  7.                 return (result);   
  8.             }   
  9.         } else {   
  10.             synchronized (map) {   
  11.                 return (map.put(key, value));   
  12.             }   
  13.         }   
  14.     }  
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.
分享到:
评论
1 楼 frenchmay 2009-03-21  
请标明转载的出处
http://frenchmay.iteye.com/blog/226784

相关推荐

    org.apache.commons所有经典jar包收集

    org.apache.commons 的经典jar 包 commons-beanutils-1.8.0-bin、 commons-betwixt-0.8、 commons-cli-1.1、 commons-codec-1.3、 commons-collections-3.2.1-bin、 commons-digester-1.8、 ...

    解决NestableRuntimeException

    当使用json技术时需要很多工具包,...2、java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMap org.apache.c 3、java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    Apache commons jar包常用类讲解--Jakarta Commons 学习.pdf

    - **SystemUtils**:提供了关于当前系统环境的信息,如操作系统类型、Java版本等。 - **Validate**:提供了校验参数是否为空、是否符合某种条件等方法。 - **WordUtils**:提供了处理单词的方法,如首字母大写、截取...

    自定义标签教程

    } else if ("FastHashMap".equals(type)) { return new FastHashMap(); } else if ("FastTreeMap".equals(type)) { return new FastTreeMap(); } return new HashMap(); // 默认返回HashMap } public void ...

    struts源码解析

    7. **FastHashMap**: FastHashMap是Struts中一个优化过的哈希映射实现,比Java内置的HashMap更快。它用于存储和查找配置信息、ActionMapping等,提供高效的键值对存储和检索。 通过阅读和理解Struts的源码,开发者...

    JakartaCommons 详细教程更助于你的基础

    - FastArrayList、FastHashMap和FastTreeMap:提供比标准实现更快速的集合类。 - ExtendedProperties:增强了属性列表的实现。 3. Jakarta Commons BeanUtils Commons BeanUtils库提供了一种简化Java Bean属性操作...

    Jakarta+Commons中文介绍

    ##### FastArrayList/FastHashMap/FastTreeMap 这些类提供了更快的集合实现,通过减少同步操作来提高性能。 ##### ExtendedProperties **ExtendedProperties** 类提供了扩展的属性集实现,支持额外的功能。 ####...

    apache commons 文档

    - **FastArrayList**、**FastHashMap** 和 **FastTreeMap**:这些集合类是对应Java标准集合类的增强版本,提供了更快的迭代器。 - **ExtendedProperties**:是对标准Properties类的扩展,提供了更多功能。 - **...

Global site tag (gtag.js) - Google Analytics