解析Java类和对象的初始化历程[Java编程]
本文“解析Java类和对象的初始化历程[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
本文主要对类和对象初始化全历程举行解析,通过一个实际问题引入,将源代码转换成 JVM 字节码后,对 JVM 履行历程的关键点举行全面解析,并在文中穿插入了相关 JVM 标准和 JVM 的部份内部理论知识,以理论与实际结合的方法介绍对象初始化和类初始化之间的合作以及大概存在的冲突问题.
问题引入
近日我在调试一个列举范例的解析器程序,该解析器是将数据库内一万多条列举代码装载到缓存中,为了实现快速定位列举代码和具体列举类别的全部列举元素,该类在装载列举代码的同时对其采纳两种战略成立内存索引.由于该类是一个大众服务类,在程序各个层面城市利用到它,因此我将它实现为一个单例类.这个类在我调整类实例化语句位置之前运行正常,但当我把该类实例化语句调整到静态初始化语句之前时,我的程序不再为我工作了. 下面是经过我简化后的示例代码:
[清单一]
package com.ccb.framework.enums;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class CachingEnumResolver {
//单态实例 一切问题皆由此行惹起
private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = new CachingEnumResolver();
/*MSGCODE->Category内存索引*/
private static Map CODE_MAP_CACHE;
static {
CODE_MAP_CACHE = new HashMap();
//为了阐明问题,我在这里初始化一条数据
CODE_MAP_CACHE.put("0","北京市");
}
//private, for single instance
private CachingEnumResolver() {
//初始化加载数据 惹起问题,该办法也要负点责任
initEnums();
}
/** * 初始化全部的列举范例 */
public static void initEnums() {
// ~~~~~~~~~问题从这里开始表露 ~~~~~~~~~~~//
if (null == CODE_MAP_CACHE) {
System.out.println("CODE_MAP_CACHE为空,问题在这里开始表露.");
CODE_MAP_CACHE = new HashMap();
}
CODE_MAP_CACHE.put("1", "北京市");
CODE_MAP_CACHE.put("2", "云南省");
//..... other code...
}
public Map getCache() {
return Collections.unmodifiableMap(CODE_MAP_CACHE);
}
/** * 获得单态实例 * * @return */
public static CachingEnumResolver getInstance() {
return SINGLE_ENUM_RESOLVER;
}
public static void main(String[] args) {
System.out.println(CachingEnumResolver.getInstance().getCache());
}
}
想必大家看了上面的代码后会感受有些茫然,这个类看起来没有问题啊,这的确属于典型的饿汉式单态情势啊,怎么会有问题呢?
是的,他看起来的确没有问题,但是假如将他 run 起来时,后来果是他不会为你精确 work.运行该类,它的履行后果是:
以上是“解析Java类和对象的初始化历程[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |