单例模式

文章目录

饿汉式

/**
 * 饿汉模式
 */
public class MyObject {
    //私有构造函数
    private MyObject(){}
    //立即加载方式==饿汉模式
    private static MyObject myObject=new MyObject();

    public static MyObject getInstance(){
        // 此代码版本为立即加载
        // 此版本代码的缺点是不能有其它实例变量
        // 因为getInstance()方法没有同步
        // 所以有可能出现非线程安全问题
        return myObject;
    }

}

测试:

public class Demo {
    public static void main(String[] args) {
        Thread t1=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(MyObject.getInstance().hashCode());
            }
        });
        t1.start();

        Thread t2=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(MyObject.getInstance().hashCode());
            }
        });
        t2.start();
    }
}

结果:
在这里插入图片描述
多线程获取单例,打印的hashcode是同一个值,说明对象是同一个

懒汉式

/**
 * 懒汉模式
 */
public class SingletonDemo {
    //类初始化时,不初始化这个对象(延时加载,真正用到的时候再创建)
    private static SingletonDemo instance;
    //构造器私有化
    private SingletonDemo(){}
    //方法同步,调用效率低
    public static synchronized SingletonDemo getInstance(){
        if (instance==null){
            instance=new SingletonDemo();
        }
        return instance;
    }
}

测试:

 new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonDemo.getInstance().hashCode());
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonDemo.getInstance().hashCode());
            }
        }).start();

结果:

460837481
460837481
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页