亦称:Singleton
Ensure a class has only one instance,and provide a global point of access to it. 确保一个类只有一个实例,并且提供一个访问它的全局方法。
单例模式同时解决了两个问题, 所以违反了单一职责原则:
保证一个类只有一个实例。
为该实例提供一个全局访问节点。
和全局变量一样, 单例模式也允许在程序的任何地方访问特定对象。 但是它可以保护该实例不被其他代码覆盖。
当Singleton类装载时就实例化一个变量,避免了线程同步问题。
/**
* 饿汉式静态变量单例
*/
public class Singleton {
private final static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
当Singleton类装载时就执行静态代码块,初始化一个单例
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance() {
return instance;
}
}
如果没有volatile修饰单例对象,可能会发生指令重排,导致错误。实例化对象,分为3步,分配空间->初始化对象->将对象指向分配的空间,如果第二步和第三步被重排,会出现异常。
/**
* 双重检查锁的懒汉单例
*/
public class Singleton {
private volatile static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}