Skip to content

Latest commit

 

History

History
78 lines (65 loc) · 1.83 KB

File metadata and controls

78 lines (65 loc) · 1.83 KB

介绍

  • 属于创建型设计模式
  • 优点:确保所有的对象都访问一个实例,避免对共享资源的多重占用
  • 缺点:不适用于变化的对象,扩展困难
  • 单例模式应用在 Spring Bean 的创建中

枚举

构造单例最简单的方法,就是使用枚举

使用枚举可以保证线程安全

// 枚举
public enum ZooEnum {
    Instance;

    @Override
    public String toString() {
        return getDeclaringClass().getCanonicalName() + "@" + hashCode();
    }
}

双重检测

// 线程安全,懒加载

public class ZooDoubleCheck {

    private static volatile ZooDoubleCheck instance;

    private ZooDoubleCheck() {
        // 防止通过反射调用实例化
        if (instance != null) {
            throw new IllegalStateException("Already initialized.");
        }
    }

    public static ZooDoubleCheck getInstance() {
        // 使用局部变量会加快速度
        ZooDoubleCheck check = instance;
        if (check == null) {
            synchronized (ZooDoubleCheck.class) {
                // 更新局部变量
                check = instance;
                if (check == null) {
                    // 双重检测都为null时进行实例化
                    instance = check = new ZooDoubleCheck();
                }
            }
        }
        return check;
    }
}

内部类

线程安全,懒加载

public class ZooInner {

    // 私有构造方法
    private ZooInner() {
    }

    public static ZooInner getInstance() {
        return Holder.INSTANCE;
    }

    private static class Holder {
        private static final ZooInner INSTANCE = new ZooInner();
    }
}