您的位置:首页 > 其它

单例模式静态内部类实现线程安全。

2016-06-07 15:37 399 查看

模拟单例的类

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: