单例模式的5种写法

版权声明:本文为博主原创文章,转载请指明出处: https://blog.csdn.net/qq_34178598/article/details/83374718

前言:单例模式是23种设计模式中最简单的一种,也是笔试面试中最常考察的一种设计模式,所以我们必须掌握它。

1.饿汉(线程安全)

/**
 * 饿汉
 *
 * @author [email protected]
 * @date 18-6-14 下午4:52
 */
public class Demo1 {
    private static Demo1 demo1 = new Demo1();

    private Demo1() {

    }

    public static Demo1 getInstance() {
        return demo1;
    }

    public static void main(String[] args) {
        System.out.println(Demo1.getInstance().hashCode());
        System.out.println(Demo1.getInstance().hashCode());
    }
}

2.懒汉(线程不安全)


/**
 * 懒汉 线程不安全
 *
 * @author [email protected]
 * @date 18-6-14 下午4:53
 */
public class Demo2 {
    private static Demo2 demo2 = null;

    private Demo2() {

    }

    public static Demo2 getInstance() {
        if (demo2 == null) {
            demo2 = new Demo2();
        }
        return demo2;
    }

    public static void main(String[] args) {
        System.out.println(Demo2.getInstance().hashCode());
        System.out.println(Demo2.getInstance().hashCode());

    }
}

3.懒汉双重锁验证(线程安全)

/**
 * 懒汉2
 *
 * @author [email protected]
 * @date 18-6-14 下午4:55
 */
public class Demo3 {
    private static volatile Demo3 demo3 = null;

    private Demo3() {
    }

    public static Demo3 getInstance() {
        if (demo3 == null) {
            synchronized (Demo3.class) {
                if (demo3 == null) {
                    demo3 = new Demo3();
                }
            }
        }
        return demo3;
    }

    public static void main(String[] args) {
        System.out.println(Demo3.getInstance().hashCode());
        System.out.println(Demo3.getInstance().hashCode());
    }
}

4.静态内部类(线程安全,推荐)

/**静态内部类
 * @author [email protected]
 * @date 18-6-14 下午4:59
 */
public class Demo4 {
    private Demo4() {
       
    }


    private static class Demo4Instance {
        private static Demo4 demo4 = new Demo4();
    }

    public static Demo4 getInstance() {
        return Demo4Instance.demo4;
    }

    public static void main(String[] args) {
    }

}

由于静态内部类跟外部类是平级的,所以外部类加载的时候不会影响内部类,因此实现了lazy loading;同时也是利用静态变量的方式,使得Demo4只会在Demo4Instance加载的时候初始化一次,从而保证不会有多线程初始化的情况,因此也是线程安全的。

 

5.枚举(线程安全) 

/**枚举
 * @author [email protected]
 * @date 18-6-14 下午5:02
 */
public enum Demo5 {
   
    getInstance;

    private Demo5Instance demo5Instance;

    public Demo5Instance getDemo5Instance(){
        return demo5Instance;
    }
    
    Demo5() { //只初始化一次
        demo5Instance = new Demo5Instance();
    }
    
    public static void main(String[] args) {
        Demo5Instance demo5Instance = Demo5.getInstance.getDemo5Instance();
        Demo5Instance demo5Instance2 = Demo5.getInstance.getDemo5Instance();
        System.out.println(demo5Instance2.hashCode());
        System.out.println(demo5Instance.hashCode());
    }

}

class Demo5Instance {

}

猜你喜欢

转载自blog.csdn.net/qq_34178598/article/details/83374718