1. 懒汉单例模式
线程不安全的单例模式。
public class Singleton {
private Singleton() {}
private static Singleton single=null;
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
Singleton通过将构造方法限定为private避免了其他类通过访问构造器进行实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过静态的getInstance()方法进行访问。但在并发的情况下是可能出现这种情况,非农数据就是a线程先进入getInstance()方法在创建实例化的时候,也就是还没创建成功,b线程也进入了getInstance()方法,这个时候a线程实例还没建成功,b线程判断single为空也开始创建实例,导致会出现创建出两个实例来。
2. synchronized 修饰的懒汉单例模式
但并发的时候也只能一个一个排队进行getInstance()方法访问。
public static synchronized Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
3. 双重检查锁定的单例模式
在并发量高的情况下,不需要排队访问getInstance()方法,性能上会优于synchronized 修饰的懒汉单例模式。
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
4. 静态内部类实现单例模式
静态内部类实现单例模式,这种方式优于上的方式,它即实现了线程安全,又省去了null的判断
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
5. 饿汉实现单例模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
6. 饿汉变种实现单例模式
public class Singleton {
private Singleton instance = null;
static {
instance = new Singleton();
}
private Singleton (){}
public static Singleton getInstance() {
return this.instance;
}
}
7. 枚举实现单例模式
public enum EnumSingleton {
INSTANCE;
public void whateverMethod() {
}
枚举其实底层是依赖Enum类实现的,这个类的成员变量都是static类型的,并且在静态代码块中实例化的,和饿汉单例模式有点像。