单例模式

1.单例模式:保证整个系统中一个类只能有一个实例,而且这个实例只能是自身创建。外部不能直接创建对象(不能new)只能通过类中的固定方法获取。

2.单例模式类型:

  01.懒汉式:(在调用的时候实例化)

public class DanLi {

    // 私有化构造,防止外部直接调用
    private DanLi() {
    }

    // 创建私有化的变量
    private static DanLi danLi = null;

    // 创建静态工厂
    public static DanLi getInstance() {
        if (danLi == null) {
            danLi = new DanLi();
        }
        return danLi;
    }

}
懒汉

    线程不安全,当多个线程同时调用该方法的时候,就会创建多个实例。为了实现线程安全可以采用:

    001.添加同步校验锁

public class DanLi {

    // 私有化构造,防止外部直接调用
    private DanLi() {
    }

    // 创建私有化的变量
    private static DanLi danLi = null;

    // 创建静态工厂
    public static synchronized DanLi getInstance() {
        if (danLi == null) {
            danLi = new DanLi();
        }
        return danLi;
    }

}
同步锁

    002.双重锁

public class DanLi {

    //私有化构造,防止外部直接调用
    private DanLi(){}
    //创建私有化的变量
    private static DanLi danLi = null;
    //创建静态工厂
    public static synchronized DanLi getInstance(){
        if (danLi == null) {
            synchronized (DanLi.class) {
                if (danLi == null) {
                    danLi = new DanLi();
                }
            }
        }
        return danLi;
    }
    
}
双重锁

    003.静态内部类

public class DanLi {

    // 私有化构造,防止外部直接调用
    private DanLi() {
    }

    private static class LazyHolder {
        private static final DanLi INSTANCE = new DanLi();
    }

    // 创建静态工厂
    public static DanLi getInstance() {
        return LazyHolder.INSTANCE;
    }

}
静态内部类

  02.饿汉式:(在初始化时自动进行实例化)

    在创建类的同时就已经创建好了一个静态的对象供系统使用,以后也不会再改变,故线程安全

public class DanLi {

    // 私有化构造,防止外部直接调用
    private DanLi() {
    }

    private static final DanLi danli = new DanLi();
    
    public static DanLi getInstance(){
        return danli;
    }

}
饿汉
原文地址:https://www.cnblogs.com/milu0620/p/6995715.html