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

模拟单例的类

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值