(四)单例模式(5种写法)

一.饿汉模式

/**
 * 饿汉式,
 * 类加载到内存后,就实例化一个单例,JVM保证线程安全,
 * 简单使用
 * 缺点:无论是否使用,类装载时就实例化
 * Class.forName("")
 * */

public class SingleDesign {
    public final static SingleDesign instance = new SingleDesign();
    private SingleDesign(){}
    public static SingleDesign getSingleInstance(){
        return instance;
    }


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

二.懒汉模式

/**
 * 懒汉式
 * 线程不安全
 * 可以通过加synchronized来保证线程安全,不过会导致性能下降
 * */
public class SingleDesign2 {
    private static volatile SingleDesign2 instance = null;
    private SingleDesign2(){}

    public static synchronized SingleDesign2 getSingleInstance(){
        if (instance == null){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            instance = new SingleDesign2();
        }

        return instance;
    }

    public static void main(String[] args){
        //System.out.println(SingleDesign2.getSingleInstance() == SingleDesign2.getSingleInstance());
        for (int i=0;i<100;i++){
            new Thread(()->{
                System.out.println(SingleDesign2.getSingleInstance().hashCode());
            }).start();
        }
    }
}

三.双重条件下的懒汉模式

/**
 * 懒汉式地进一步优化
 * 双重检查
 * 线程安全
**/
public class SingleDesign3 {
    private static volatile SingleDesign3 instance = null;
    private SingleDesign3(){}

    public static SingleDesign3 getSingleInstance(){
        if (instance == null){
            //双重检查
            synchronized (SingleDesign3.class){
                if (instance == null){
                    instance = new SingleDesign3();
                }
            }
        }
        return instance;
    }

    public static void main(String[] args){
        for (int i=0;i<100;i++){
            new Thread(()->{
                System.out.println(SingleDesign3.getSingleInstance().hashCode());
            }).start();
        }
    }
}

四.内部类实现方式

/**
 * 使用内部类的方式实现,线程安全,更加完美的方式
 *
 * */
public class SingleDesign4 {
    private SingleDesign4(){}

    public static SingleDesign4 getSingleInstance(){
        return InnerSingleDesign4.instance;
    }

    //内部类
    private static class InnerSingleDesign4{
        private static final SingleDesign4 instance = new SingleDesign4();
    }

    public static void main(String[] args){

        for (int i=0;i<100;i++){
            new Thread(()->{
                System.out.println(SingleDesign4.getSingleInstance().hashCode());
            }).start();
        }
    }
}

五.枚举实现方式


/**
 * 不仅可以解决线程同步,还可以防止反序列化(枚举没有构造方法),最完美的方式
 *
 *
 * */
public enum SingleDesign5 {
    INSTANCE;

    public static void main(String[] args){
        for (int i=0;i<100;i++){
            new Thread(()->{
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(SingleDesign5.INSTANCE.hashCode());
            }).start();
        }
    }
}

你可能感兴趣的:((四)单例模式(5种写法))