单例模式


package com.dounion;

/**
 * 单例模式
 */
public class SingletonTest {

    public static void main(String[] args) {

        Singleton1 instance1 = Singleton1.getInstance();
        Singleton1 instance2 = Singleton1.getInstance();
        System.out.println("懒汉式1 test:" + (instance1 == instance2));

        Singleton2 instance3 = Singleton2.getInstance();
        Singleton2 instance4 = Singleton2.getInstance();
        System.out.println("懒汉式2 test:" + (instance3 == instance4));

        Singleton3 instance5 = Singleton3.getInstance();
        Singleton3 instance6 = Singleton3.getInstance();
        System.out.println("饿汉式 test:" + (instance5 == instance6));
    }

}

//线程不安全 懒汉式1
class Singleton1 {

    private static Singleton1 instance = null;

    public static Singleton1 getInstance() {
        if (instance == null) {
            instance = new Singleton1();
        }
        return instance;
    }

}

//线程安全 懒汉式2 (double checked lock)

class Singleton2 {

    private static Singleton2 instance = null;

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


//饿汉式 不会出现线程安全问题
class Singleton3 {

    private static Singleton3 instance = new Singleton3();

    public static Singleton3 getInstance() {
        return instance;
    }

}