解析 java 类和对象的初始化过程

解析 java 类和对象的初始化过程

ID:13027566

大小:47.54 KB

页数:11页

时间:2018-07-20

解析 java 类和对象的初始化过程_第1页
解析 java 类和对象的初始化过程_第2页
解析 java 类和对象的初始化过程_第3页
解析 java 类和对象的初始化过程_第4页
解析 java 类和对象的初始化过程_第5页
资源描述:

《解析 java 类和对象的初始化过程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、解析Java类和对象的初始化过程由一个单态模式引出的问题谈起北京高伟达西南分软JavaEE软件工程师,三年JavaEE项目经验,行业方向为银行OCRM系统。对JAVA有着浓厚的兴趣,业余研究AOP/ESB方向。简介: 类的初始化和对象初始化是JVM管理的类型生命周期中非常重要的两个环节,Google了一遍网络,有关类装载机制的文章倒是不少,然而类初始化和对象初始化的文章并不多,特别是从字节码和JVM层次来分析的文章更是鲜有所见。本文主要对类和对象初始化全过程进行分析,通过一个实际问题引入,将源代码转换成

2、JVM字节码后,对JVM执行过程的关键点进行全面解析,并在文中穿插入了相关JVM规范和JVM的部分内部理论知识,以理论与实际结合的方式介绍对象初始化和类初始化之间的协作以及可能存在的冲突问题。问题引入近日我在调试一个枚举类型的解析器程序,该解析器是将数据库内一万多条枚举代码装载到缓存中,为了实现快速定位枚举代码和具体枚举类别的所有枚举元素,该类在装载枚举代码的同时对其采取两种策略建立内存索引。由于该类是一个公共服务类,在程序各个层面都会使用到它,因此我将它实现为一个单例类。这个类在我调整类实例化语句位置

3、之前运行正常,但当我把该类实例化语句调整到静态初始化语句之前时,我的程序不再为我工作了。下面是经过我简化后的示例代码:[清单一]packagecom.ccb.framework.enums;importjava.util.Collections;importjava.util.HashMap;importjava.util.Map;publicclassCachingEnumResolver{//单态实例 一切问题皆由此行引起privatestaticfinalCachingEnumResolverSI

4、NGLE_ENUM_RESOLVER=newCachingEnumResolver();/*MSGCODE->Category内存索引*/privatestaticMapCODE_MAP_CACHE;static{CODE_MAP_CACHE=newHashMap();//为了说明问题,我在这里初始化一条数据CODE_MAP_CACHE.put("0","北京市");}//private,forsingleinstanceprivateCachingEnumResolver(){//初始化加载数据引起问

5、题,该方法也要负点责任initEnums();}/***初始化所有的枚举类型*/publicstaticvoidinitEnums(){//~~~~~~~~~问题从这里开始暴露~~~~~~~~~~~//if(null==CODE_MAP_CACHE){System.out.println("CODE_MAP_CACHE为空,问题在这里开始暴露.");CODE_MAP_CACHE=newHashMap();}CODE_MAP_CACHE.put("1","北京市");CODE_MAP_CACHE.put(

6、"2","云南省");//.....othercode...}publicMapgetCache(){returnCollections.unmodifiableMap(CODE_MAP_CACHE);}/***获取单态实例**@return*/publicstaticCachingEnumResolvergetInstance(){returnSINGLE_ENUM_RESOLVER;}publicstaticvoidmain(String[]args){System.out.println(Cach

7、ingEnumResolver.getInstance().getCache());}}想必大家看了上面的代码后会感觉有些茫然,这个类看起来没有问题啊,这的确属于典型的饿汉式单态模式啊,怎么会有问题呢?是的,他看起来的确没有问题,可是如果将他run起来时,其结果是他不会为你正确work。运行该类,它的执行结果是:[清单二]CODE_MAP_CACHE为空,问题在这里开始暴露.{0=北京市}我的程序怎么会这样?为什么在initEnum()方法里CODE_MAP_CACHE为空?为什么我输出的CODE_MA

8、P_CACHE内容只有一个元素,其它两个元素呢????!!看到这里,如果是你在调试该程序,你此刻一定觉得很奇怪,难道是我的Jvm有问题吗?非也!如果不是,那我的程序是怎么了?这绝对不是我想要的结果。可事实上无论怎么修改initEnum()方法都无济于事,起码我最初是一定不会怀疑到问题可能出在创建CachingEnumResolver实例这一环节上。正是因为我太相信我创建CachingEnumResolver实例的方法,加之对Java类初始化

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。