亦称:Singleton

Ensure a class has only one instance,and provide a global point of access to it. 确保一个类只有一个实例,并且提供一个访问它的全局方法。

问题

单例模式同时解决了两个问题, 所以违反了单一职责原则:

  1. 保证一个类只有一个实例。

  2. 为该实例提供一个全局访问节点。

    和全局变量一样, 单例模式也允许在程序的任何地方访问特定对象。 但是它可以保护该实例不被其他代码覆盖。

解决方案

饿汉式静态变量【可用】

Untitled

当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;
    }

}

静态内部类方式【推荐】