单例模式是指在任何时候,都只有一个实例,比如DataSource

饿汉式单例

饿汉式单例是指在类创建时就对实例进行创建,不需要锁,所以效率高


public class HungrySingleton {
    private static final HungrySingleton hungrySingleton= new HungrySingleton();

    private HungrySingleton() {
    }

    public static HungrySingleton getInstance() {
        return hungrySingleton;
    }
}

懒汉式单例

懒汉式单例是指在使用时再对实例进行创建,但是在多线程情况下会出现重复创建实例的情况,所以需要双重检查锁对其进行检查 同时使用volatile确保内存可见性
相比饿汉式单例,懒汉式单例在不使用时,就不会创建对象,节约了内存开销,所以普遍认为懒汉式效率比较高


public class LazySingleton {
    public volatile static LazySingleton lazySingleton;

    private LazySingleton() {
    }

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

枚举式单例

在Effective Java中提到了一种利用Enum实现单例模式

第3条: 用私有构造器和或者枚举类型强化singleton属性
枚举单例实现更加简介,无偿提供了序列化机制,即时是复杂的序列化和反射攻击的时候,也可以防止多次实例化。


public enum EnumSingleton {
    INSTANCE;

    private Object data;

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public static EnumSingleton getInstance() {
        return INSTANCE;
    }
}