单例模式Singleton
单例模式是设计模式最简单基础的模式之一, 下面介绍几种常见的单例模式的实现方式.
懒汉
这种单例模式用于单线程程序设计, 当程序设计需要应用并发时,
这种实现无法保证单例类只会被实例化一次.
public class BasicSingleton {
public static Singleton instance;
private BasicSingleton(){}
public static Singleton getInstance(){
if (instance == null)
instance = new Singleton();
return instance;
}
}
懒汉 + 同步区
通过简单的同步去加锁, 就做到了线程安全, 适用于性能要求不高的场景.
public class BasicSingleton {
public static Singleton instance;
private BasicSingleton() {}
public static synchronized Singleton getInstance() {
if (instance == null)
instance = new Singleton();
return instance;
}
}
饿汉
利用Java类的加载机制, 在加载类期间初始化一个实例, 但是
这种实现不具备懒惰实例(lazy)的特性
public class EagerSingleton{
public static EagerSingleton instance = new EagerSingleton();
public static getInstance(){
return instance;
}
}
双重检查加锁 Double-Check-Lock
只在第一次实例化期间进行同步区加锁, 既保证了性能, 又确保线程安全.
需要valatile
关键字支持
public class Singleton {
public static volatile Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
枚举
利用枚举的特性可以实现线程安全的单例, 枚举的每个元素就是一个实例, 且每次访问的都是同一个实例.同时可以避免反序列化实例出多个对象. 但不具备延迟加载的特性了.
这种方式代码最简单, 这也是Effective Java中推荐的方式.
public enum EnumSingleton{
SINGLETON;
private int fields;
private void foo(){};
}