单例模式
单例模式是指在任何时候,都只有一个实例,比如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;
}
}
Read other posts