1.懒汉模式
懒汉模式(可以理解为延迟加载)
public class Singleton{
private static Singleton singleton;
private Singleton() {
}
public synchronized static Single newInstance() { //加入synchronized关键字可以避免多线程的问题
if (singleton== null) {
singleton= new Singleton();
}
return singleton;
}
}
2.饿汉模式
饿汉模式(贪婪加载)
public class Singleton {
//在对象声明的时候直接初始化对象
private static Singleton singleton= new Singleton();
private singleton() {
}
public static Singleton newInstance() {
return singleton;
}
}
3.双重检查加锁
public class Singleton {
//加入volatile关键字避免了多线程,又不会降低性能
private volatile static Singleton singleton;
private Singleton() {
}
public static Singleton newInstance() {
if (singleton == null) {
//使用同步块
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
4.枚举
public enum Singleton {
//枚举是写法最简单的,默认枚举实例的创建时线程安全的,且在任何一种情况下它都是单例,包括反序列化
INSTANCE;
}
5.静态内部类
public class Singleton {
private Singleton() {
}
public Singleton getInstance() {
return SingletonHolder.SINGLETON;
}
private static class SingletonHolder {
private static final Singleton SINGLETON = new Singleton();
}
}
当第一次加载Singleton类时并不会初始化SINGLRTON,只有第一次调用getInstance方法的时候才会初始化SINGLETON第一次调用getInstance 方法的时候虚拟机才会加载SingletonHoder类,这种方式不仅能够保证线程安全,也能够保证对象的唯一,还延迟了单例的实例化,所以推荐使用这种方式
总结:单例模式是为了保证系统中只有一个实例,主要注意它有private的构造方法,只有一个对象,需要返回单例对象,在反序列化不会重新创建新的对象
原文:https://www.cnblogs.com/doosn777/p/10902570.html