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

来源:互联网 发布:java xml 字节点 编辑:程序博客网 时间:2024/05/18 21:39

模拟单例的类

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。

0 0
原创粉丝点击