单例模式
在运行期间,保证某个类只创建一个实例,保证一个类仅有一个实例,并提供一个访问它的全局访问点
饿汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
- 优点就是实现简单,而且安全可靠
- 缺点,没有懒加载,可能用不到,却实例化了
懒汉式
public class SingletonSafe {
// 防止指令重排
private static volatile SingletonSafe singleton;
private SingletonSafe() {
}
public static SingletonSafe getSingleton() {
if (singleton == null) {
synchronized (SingletonSafe.class) {
if (singleton == null) {
singleton = new SingletonSafe();
}
}
}
return singleton;
}
}
双重检查,保证线程安全
静态内部类
public class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
- 通过静态内部类的方式实现单例模式是线程安全的,同时静态内部类不会在Singleton类加载时就加载,而是在调用getInstance()方法时才进行加载,达到了懒加载的效果。
- 缺点:可能会有反射攻击或者反序列化攻击
通过枚举实现单例模式(推荐)
effective java推荐
public enum Singleton {
/**
* Inst singleton.
*/
INST;
/**
* The Singles.
*/
private static final Map<String, Object> SINGLES = new ConcurrentHashMap<>();
/**
* Single.
*
* @param clazz the clazz
* @param o the o
*/
public void single(final Class clazz, final Object o) {
SINGLES.put(clazz.getName(), o);
}
/**
* Get t.
*
* @param <T> the type parameter
* @param clazz the clazz
* @return the t
*/
@SuppressWarnings("unchecked")
public <T> T get(final Class<T> clazz) {
return (T) SINGLES.get(clazz.getName());
}
}