单例模式

简介

单例模式确保一个类只有一个实例,并提供一个全局访问点。

实现

  • 使用”急切”创建实例(饿汉式)
    在JVM加载类时创建单例。保证了线程安全。
public class Singleton {
    //静态初始化
	private static Singleton uniqueInstance = new Singleton();
 
	private Singleton() {}
 
	public static Singleton getInstance() {
		return uniqueInstance;
	}
}
  • 使用”双重检查加锁”,延迟实例化创建实例(懒汉式)
    检查实例,如果不存在就进入同步代码块。进入代码块后,再检查一次,如果仍是null,才创建实例。
    注意:只有第一次才彻底执行同步代码块的代码,大大减少getInstance方法的时候耗费。
    volatile 关键词确保,当uniqueInstance变量被初始化成Singleton实例时,多个线程正确的处理uniqueInstance变量。
public class Singleton {
	private volatile static Singleton uniqueInstance;
 
	private Singleton() {}
 
	public static Singleton getInstance() {
		if (uniqueInstance == null) {
			synchronized (Singleton.class) {
				if (uniqueInstance == null) {
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}

使用

public class SingletonClient {
	public static void main(String[] args) {
		Singleton singleton = Singleton.getInstance();
	}
}