懒汉

单例模式的3种实现方式, 及其性能对比

余生长醉 提交于 2020-02-29 01:26:38
1. 懒汉模式(double check), 线程安全, 效率不高, 可以延迟加载 public class Singleton1 implements Serializable { // 用volatile修饰instance, 禁止指令重排序, 为保证多线程安全 private volatile static Singleton1 instance = null; private Singleton1() { // 防止反射调用私有构造方法(跳过安全检查), 重复实例化实例 if (instance != null) { throw new RuntimeException("error:instance=" + instance); } } public static Singleton1 getInstance() { if (instance == null) { synchronized (Singleton1.class) { if (instance == null) { instance = new Singleton1(); } } } return instance; } private Object readResolve() { return instance; // 防止反序列化重复实例化实例 } } 2. 饿汉模式, 线程安全, 效率高,

Hutool之单例池——Singleton

二次信任 提交于 2019-11-29 07:23:20
为什么会有这个类 平常我们使用单例不外乎两种方式: 在对象里加个静态方法getInstance()来获取。此方式可以参考 【转】线程安全的单例模式 这篇博客,可分为饿汉和饱汉模式。 通过Spring这类容器统一管理对象,用的时候去对象池中拿。Spring也可以通过配置决定懒汉或者饿汉模式 说实话我更倾向于第二种,但是Spring更对的的注入,而不是拿,于是我想做Singleton这个类,维护一个单例的池,用这个单例对象的时候直接来拿就可以,这里我用的懒汉模式。我只是想把单例的管理方式换一种思路,我希望管理单例的是一个容器工具,而不是一个大大的框架,这样能大大减少单例使用的复杂性。 使用 package com.xiaoleilu.hutool.demo; import com.xiaoleilu.hutool.Singleton; /** * 单例样例 * @author loolly * */ public class SingletonDemo { /** * 动物接口 * @author loolly * */ public static interface Animal{ public void say(); } /** * 狗实现 * @author loolly * */ public static class Dog implements Animal{