模拟单例的类
package singleton.test;
public class MyObject {
private MyObject() {
// TODO Auto-generated constructor stub
}
static {
System.out.println("XXXX");
}
/**
* 内部类实现单例模式
*
* @author cindy
*
*/
private static class MyObjectHandle {
private static MyObject myObject = new MyObject();
static {
System.out.println("1234");
}
}
public static MyObject getInstance() {
return MyObjectHandle.myObject;
}
public static void display() {
//测试静态代码块是否加载 System.out.println("ldjfdfasdfdsfdsff");
}
}
测试类
package singleton.test;
public class SingletonTest {
public SingletonTest() {
// TODO Auto-generated constructor stub
}
static class Mythread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
System.out.println("Singleton hashcode" + MyObject.getInstance());
}
}
public static void main(String[] args) {
Mythread mythread1 = new Mythread();
Mythread mythread2 = new Mythread();
Mythread mythread3 = new Mythread();
// mythread1.start(); //@1
// mythread2.start();
// mythread3.start();
//@2
MyObject myObject = null;
myObject.display();
}
}
如果将1和2出的代码都注释掉,输出结果是如图。说明静态内部类以及MyObject类都没有加载,如果加载那么静态代码块一定执行。
将2段代码执行
输出结果是,说明MyObject静态代码块执行了,也就说明MyObject类加载到JVM了但是静态内部类还没有加载到虚拟机。
将1段代码执行看到哈希码值是一样的。说明是单例模式。同时只有getInstance方法执行后静态内部类才加载到JVM中。也是一种延时加载的实现方法。
Java机制规定,内部类 MyObjectHandle只有在getInstance()方法第一次调用的时候才会被加载(实现了延迟加载效果),而且其加载过程是线程安全的(实现线程安全)。内部类加载的时候实例化一次instance。