- 浏览: 403112 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (176)
- J2EE (24)
- Oracle (16)
- WebService (2)
- Other (11)
- 编译可添加参数 -keep-generated-actionscript=true (1)
- Log4 日志级别 (1)
- 汉字转拼音 (1)
- 定制文件提取和下载(提供多选) (1)
- soa suit update ip (1)
- IBM X3850 X5 系统安装 (1)
- XEN 虚拟化技术 (3)
- Windows 2003 (1)
- suse (1)
- solaris (1)
- weblogic (3)
- linux (2)
- solairs (1)
- os (1)
- oracle linux suse (1)
- Oracle Inventory Directory (1)
- 开启JBoss7的access_log功能 (0)
- jboss (2)
- 2013 (0)
- 2013-oracle-bpm (2)
- Oracle ERP (2)
- javascript (1)
- start shell command (1)
- PowerDesigner反向工程 mysql (1)
- http://it-ebooks.info/ (1)
- 快速上手RaphaelJS-Instant RaphaelJS Starter翻译(一) (1)
- web (1)
- 网站测速实用工具 (1)
- http://www.realvnc.com/download/vnc/5.1.1/ (1)
- 一次关于Waiting for table metadata lock的处理 (1)
- 64位系统下报libstdc++.so.6 GLIBCXX 错误 (1)
- http://baike.baidu.com/link?url=xB3rEIodVQXE7f4PACW9gi4rQeXvzwDirx8c1caiVny8VxqZHggyD3SLmJXV9_OH0jBi9xbY0toxg8noHn1O7a (1)
- MyEclipse (1)
- 探索Eclipse的OSGi控制台 (1)
- http file server (1)
- ZooKeeper-3.3.4集群安装配置 (1)
- 使用Zookeeper实现分布式共享锁 (1)
- http://blog.sina.com.cn/s/blog_7cd4dd3e0101e1rd.html (1)
- http://blog.csdn.net/chenyi8888/article/details/6626302 (1)
- http://www.cnblogs.com/qinwanlin/archive/2012/12/03/2797339.html (1)
- Apache Felix环境配备 (1)
- 安装Subversion1.82(SVN)插件 (1)
- Maven 打包war包 (1)
- squid (1)
- Nginx 做反向代理,后端是 tomcat,chrome 浏览器访问项目时加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH: (1)
- master and slave have equal MySQL server UUIDs 解决方法 (1)
- 分享6个目前国内优秀的Java开源项目----后台管理框架,值的收藏 (1)
最新评论
-
Aceslup:
嗯,已经知道解决方法了。需要JDK环境。
VisualVM指定JDK环境启动 -
静夜独窗:
很好,收藏,有时间好好看看
JVM那些事(heap&stack) -
LoveJavaMM:
你好,看了你的文章有点疑问
第一:
vi /etc/pam. ...
suse 11 telnet 和 ftp安装开通端口 -
方块石:
老兄,解压的要输入内容,是啥子
ant脚本部署war包全过程~~ -
hy158753228:
LZ有遇到过这个问题么:
我安你的说法安装了插件,打开一个.c ...
MyEclipse 8.6反编译插件安装
今天在开发过程中碰到了一处使用了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的代码实现
首先是类定义,类构造器和类属性
- public class FastHashMap extends HashMap {
- protected HashMap map = null;
- protected boolean fast = false;
- public FastHashMap() {
- super();
- this.map = new HashMap();
- }
- }
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));
- }
- }
- }
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));
- }
- }
- }
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的官方文档中已经很清楚写道:
* to operate in a multithreaded environment where the large majority of
* method calls are read-only, instead of structural changes.
发表评论
-
java jdk 下载地址
2012-01-17 14:14 1051jre http://java.com/zh_CN/down ... -
myeclipse插件汇总积累
2011-06-17 21:53 11101. tomcat插件: http://www.eclip ... -
[转]css3
2011-05-03 14:53 1309作为一个Web开发者,保持对未来Web标准的关注、学习和了解是 ... -
IE&FF兼容性
2011-04-04 17:33 12471. document.form.item 问题 (1)现 ... -
MyEclipse 8.6反编译插件安装
2011-01-08 16:03 9383第一步: 下载j ... -
QC邮件转发工具Mail Direct安装配置手册
2010-11-01 13:57 5027转 + > http://blog.163.com/k ... -
solaris机器操作....
2010-06-30 21:29 14001. 查看用户所在的组cat ... -
java反编译工具~
2010-06-11 20:10 931前几天从同事那里弄来一个很不错的java反编译工具。感觉有起来 ... -
收藏的URL
2010-02-25 17:19 10131. eclipse中反编译插件jadClipse http ... -
使用 Telnet 端口 25 测试 SMTP 通信
2010-02-24 17:10 2980From: http://www.cnitblog.com/w ... -
操作log4jAPI
2009-11-12 10:58 1213import java.io.ByteArrayOutputS ... -
Eclipse 插件
2009-10-15 10:09 13061. commons4e 插件. 这个Eclipse插件方便 ... -
最近公司内网打不开myeclipse官网
2009-06-25 09:17 2193最近想上官网下载些东西, 一直都打不开。后来使用代理 ,终 ... -
ant脚本部署war包全过程~~
2009-06-17 17:38 3844最近写了一个部署打包的ant,功能真强大,自动更新svn源码, ... -
自动生成toString方法.
2008-12-07 16:23 2100package com.zte; import java.la ... -
sqlplus如何执行command脚本。
2008-10-26 11:27 1903打开sqlplus,file->open->com ... -
使用ant 自定义复制指定文件
2008-09-08 15:19 3684//CopyFile.java类文件 import ... -
Hibernate 的 batch_size 与事务
2008-09-04 14:56 1530batch_size 即同时提交数据的数量,原本与事务并没有什 ... -
连接字符串中碰到的SelectMethod=cursor
2008-09-01 14:45 2139今天在数据库连接字符串中看到了selectMethod=cur ... -
Sqlplus中编译java需添加jar包的命令!
2008-08-20 17:52 1553loadjava -user user/pwd@sid pat ...
相关推荐
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、 ...
当使用json技术时需要很多工具包,...2、java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMap org.apache.c 3、java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
- **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 ...
7. **FastHashMap**: FastHashMap是Struts中一个优化过的哈希映射实现,比Java内置的HashMap更快。它用于存储和查找配置信息、ActionMapping等,提供高效的键值对存储和检索。 通过阅读和理解Struts的源码,开发者...
- FastArrayList、FastHashMap和FastTreeMap:提供比标准实现更快速的集合类。 - ExtendedProperties:增强了属性列表的实现。 3. Jakarta Commons BeanUtils Commons BeanUtils库提供了一种简化Java Bean属性操作...
##### FastArrayList/FastHashMap/FastTreeMap 这些类提供了更快的集合实现,通过减少同步操作来提高性能。 ##### ExtendedProperties **ExtendedProperties** 类提供了扩展的属性集实现,支持额外的功能。 ####...
- **FastArrayList**、**FastHashMap** 和 **FastTreeMap**:这些集合类是对应Java标准集合类的增强版本,提供了更快的迭代器。 - **ExtendedProperties**:是对标准Properties类的扩展,提供了更多功能。 - **...