一 :单例模式

饿汉模式

/**
 * 单例模式-饿汉模式
 * 饿汉要素
 * 1 私有化构造方法
 * 2 实例为静态变量
 * 3 类初始化的时候实例化变量,通过jvm 一个类只能被初始化一次来保证单例
 * 4 final 禁止指令重排序,防止因为并发高因为指令重排序导致的实例返回为null
 */
public class SingletonHungry {

    private static final SingletonHungry instance = new SingletonHungry();


    private SingletonHungry() {
    }

    public void m() {
        System.out.println("单例想要做的m");
    }

    public static SingletonHungry getInstance() {
        return instance;
    }

    public static void main(String[] args) {
        SingletonHungry instance = SingletonHungry.getInstance();
        SingletonHungry instance1 = SingletonHungry.getInstance();
        System.out.println(instance.hashCode() == instance1.hashCode());


    }
}

懒汉模式

/**
 * 单例模式-懒汉模式
 * 懒汉要素
 * 1 私有化构造方法
 * 2 实例为静态变量
 * 3 用到该变量的时候会被初始化
 * 4 volatile 禁止指令重排序 与饿汉的 final 有一曲同工之妙
 */
public class SingletonLazy {

    private static volatile SingletonLazy instance;


    private SingletonLazy() {
    }

    public void m() {
        System.out.println("单例想要做的m");
    }

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

    }


    public static void main(String[] args) {
        for (int i = 0; i < 200; i++) {
            new Thread(() -> {
                SingletonLazy instance = SingletonLazy.getInstance();
                System.out.println(instance.hashCode());

            }).start();
        }
    }
}

枚举模式

/**
 * 单例模式-枚举
 * 要素:
 * 1 枚举中只有一个变量
 */
public enum SingletonEnum {

    INSTANCE;

    public void m() {
        System.out.println("单例想要做的m");
    }

    public static void main(String[] args) {
        for (int i = 0; i < 200; i++) {
            new Thread(() -> {
                SingletonEnum instance = SingletonEnum.INSTANCE;
                instance.m();
                System.out.println(instance.hashCode());

            }).start();
        }
    }
}

你可能感兴趣的:(一 :单例模式)