jvm 初始化

package test;

public class A {
	private static A a = new A();

	private B b = B.getInstance();

	private A() {

	}

	public static A getInstance() {
		System.out.println("A被调用");
		return a;
	}

	public void test() {
		System.out.println(b);
	}
}

 

package test;

public class B {
	private static B b = new B();

	private A a = A.getInstance();

	private B() {

	}

	public static B getInstance() {
		System.out.println("B被调用");
		return b;
	}

	public void test() {
		System.out.println(a);
	}
}

 

package test;


/**
 * 面先说一下环境,比如现在有两个类,A和B,两个类都是单例类,这个时候如果A有个B的实例变量,B有个A的实例变量,
 * 会发生什么情况呢?开始我以为会出现栈溢出。但是让我迷惑的是,居然没问题。只是其中一个类的 实例变量会是NULL。
 * 下面看代码。 

 * @author zhang_zengmin
 *
 */
public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		B b = B.getInstance();
		b.test();
		System.out.println("==========");
		A a = A.getInstance();
		a.test();

		// A a = A.getInstance();
		// a.test();
		// System.out.println("==========");
		// B b = B.getInstance();
		// b.test();
		// System.out.println("==========");
		/**
		 * 1.类Test的main()方法的B.getInstance()生成的invokestatic指令触发了类B的初始化 
			2.执行类B的<clinit>方法的过程中,显式调用了B自己的<init>方法(static b = new B()) 
			3.B的<init>方法中,调用A.getInstance()生成的invokestatic指令触发了A的初始化(private A a = A.getInstance()) 
			4.执行A的<clinit>方法的过程中调用了A自己的<init>方法(static a = new A()) 
			5.类A的<init>方法中需要调用B.getInstance(),但是虚拟机中一个类(<class,classloader>为一个类)只会初始化一次,因此不会再触发B的初始化,既不会再执行B.<clinit>方法。 
			6.那由a.<init>触发的B.getInstance()被执行,输出第一行“B被调用”,B.getInstance()方法结束。虽然这时候B的初始化阶段尚未结束,但是解析阶段已经完成,所以getInstance()方法可以被正确执行,但这时候静态字段static B b仍然为null(注意,b.<init>方法还没完呢),所以这个B.getInstance()方法返回值为null,所以A.b为null。 
			7.A.<clinit>方法结束,第3步的invokestatic指令正式执行,即A.getInstance()被执行,输出第二行“A被调用”,返回A的实例,这时候B.a不为null了。 
			8.B.<clinit>方法结束,第1步的invokestatic指令正式执行,即B.getInstance()被执行,输出第三行“B被调用” 
			9.B.test()方法被执行,输出B.a的toString()方法结果,即第四行“A@35ce36”。 
			10.A.getInstance()方法被执行,输出第五行“A被调用”。 
			11.A.test()方法被执行,输出null,即A.b的值。 
		 */
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值