单例模式——懒汉式、饿汉式

一、懒汉式——DCL写法

  优点:解决线程、效率高

package com.atguigu.single02;
/*
    单例模式类:保证对象唯一性
    懒汉式:线程安全问题 DCL写法(双重检查)(面试终极写法)

* */
public class Single {
    //本类的成员位置,创建自己的对象
    private static Single single = null;
    private Single(){}

    /*
        为了提供程序执行效率,同步代码块(不要同步方法)
        线程操作的共享数据
    * */
    public static Single getInstance(){
        if ( single == null){
            synchronized(Single.class){
                if (single == null)
                    single = new Single();
            }
        }

        return single;
    }
}

  测试代码:

@Test
    public void testSingle02(){
        /*Single single1 = Single.getInstance();
        System.out.println("single = " + single1);
        Single single2 = Single.getInstance();
        System.out.println("single = " + single2);*/
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                Single single1 = Single.getInstance();
                System.out.println("single = " + single1);
            }).start();
        }

    }

二、饿汉式

  优点:线程安全

  缺点:效率低

package com.atguigu.single01;

/*
    单例模式类:保证对象唯一性
    饿汉式
    1. 私有修饰构造方法
    2. 本类的成员位置,创建自己的对象
        自己new自己
    3. 提供公共的方法,返回对象
* */
public class Single {
    private  static Single single = new Single();
    private Single(){}
    /*
        类文件 Single.class被加载器加入到内存中
        内存的那个位置:栈,堆,方法区,寄存器,本地方法栈
        Java的好多功能,JDK没有,调用操作系统实现:本地方法,进入本地方法栈运行

        class:方法区(JDK8-元数据区):初始化自己的静态成员

    * */

    public static Single getInstance(){
        return single;
    }

}

  测试代码:

@Test
    public void testSingle01(){
        Single single1 = Single.getInstance();
        System.out.println("single = " + single1);
        Single single2 = Single.getInstance();
        System.out.println("single = " + single2);

    }

 

上一篇:单例模式


下一篇:设计模式之单例模式