单例模式
1、饿汉式(静态常量)-可用
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton (){}
public static Singleton getInstance (){
return INSTANCE;
}
}
2、饿汉式(静态代码块)-可用
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton () {}
public Singleton getInstance () {
return instance;
}
}
3、懒汉式(线程不安全)-不可用
public class Singleton {
private static Singleton singleton;
private Singleton () {}
public static Singleton getInstance () {
if (singleton == null ) {
singleton = new Singleton();
}
return singleton;
}
}
4、懒汉式(线程安全,同步方法)-不推荐用
public class Singleton {
private static Singleton singleton;
private Singleton () {}
public static synchronized Singleton getInstance () {
if (singleton == null ) {
singleton = new Singleton();
}
return singleton;
}
}
5、懒汉式(线程安全,同步代码块)-不可用
public class Singleton {
private static Singleton singleton;
private Singleton () {}
public static Singleton getInstance () {
if (singleton == null ) {
synchronized (Singleton.class) {
singleton = new Singleton();
}
}
return singleton;
}
}
6、双重检查-推荐用
/**
* 懒汉模式 -》 双重同步锁单例模式
* 单例实例在第一次使用时进行创建
*/
@ThreadSafe
public class SingletonExample5 {
private SingletonExample5 () {
}
private volatile static SingletonExample5 instance = null ;
public static SingletonExample5 getInstance () {
if (instance == null ) {
synchronized (SingletonExample5.class) {
if (instance == null ) {
instance = new SingletonExample5();
}
}
}
return instance;
}
}
7、静态内部类-推荐用
public class Singleton {
private Singleton () {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance () {
return SingletonInstance.INSTANCE;
}
}
8、枚举-推荐用
/**
* 枚举模式:最安全
*/
@ThreadSafe
@Recommend
public class SingletonExample7 {
private SingletonExample7 () {
}
public static SingletonExample7 getInstance () {
return Singleton.INSTANCE.getInstance();
}
private enum Singleton {
INSTANCE;
private SingletonExample7 singleton;
Singleton() {
singleton = new SingletonExample7();
}
public SingletonExample7 getInstance () {
return singleton;
}
}
}