单例模式的几种实现-Java版
关键点
- 私有化构造器
- 通过静态方法或枚举返回单例类对象
- 确保单例类对象只有一个,尤其在多线程环境下。
- 确保每个类被序列化不会重新创建对象
饿汉式
/*
饿汉式
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){};
public static Singleton getInstance() {
return instance;
}
}
懒汉式
懒汉式缺点:
第一次加载需要及时进行实例化,反应稍慢
每次调用getInstance都会进行同步,造成不必要的同步开销
/*
懒汉式
*/
public class Singleton {
private static Singleton instance = null;
private Singleton(){};
public static synchronized Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
双检锁
/*
双检索 CAS
*/
public class Singleton {
private static volatile Singleton instance = null;
private Singleton(){};
public static Singleton getInstance() {
if ( instance == null ) {
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
静态内部类单例模式
优点:
第一次加载Singleton类并不会初始化instance,只有在第一次调用getInstance
方法时才会导致instance被初始化(延迟加载)。这种方式不仅能够确保线程安全,也能够保证单例对象的唯一性(利用Classloader的特性),同时也延迟了单例的实例化,所> 以这是推荐使用的单例模式实现方式。
//静态内部类单例模式
public class Singleton {
private Singleton(){};
public static Singleton getInstance() {
return SingletonHolder.instance;
}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
}
枚举方式
public enum Singleton {
INSTANCE;
}
//==========完整代码===
// 定义单例模式中需要完成的代码逻辑
public interface MySingleton {
void doSomething();
}
public enum Singleton implements MySingleton {
INSTANCE {
@Override
public void doSomething() {
System.out.println("complete singleton");
}
};
public static MySingleton getInstance() {
return Singleton.INSTANCE;
}
}