什么是单例模式
单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供全局访问点。单例模式通常用于管理全局状态、资源共享或限制资源访问的情况下。
样例代码
这串代码出自《并发编程的艺术》
样例中使用了双重检查锁来实现了单例模式,这串代码相当巧妙,属于极限性能优化的经典样例。
java
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
代码解析
这串代码在创建对象时用了两次判空操作,也就是双重检查。
首先设置了一个全局变量singleton
java
private volatile static Singleton singleton;
加volatile的作用是及时知道是否创建对象,防止更多的线程再次进入阻塞队列,在第一次判空时起作用。
随后使构造方法私有
java
private Singleton (){}
目的是为了让外面不能new对象
随后给予创建对象的方法getSingleton(),这个方法和私有的构造方法保证了单例模式的实现。
在方法内先进行了一次判空,如果是空赶紧锁起来并创建一个对象,当不为空时就可以拦截其他所有的线程。
java
if (singleton == null)
随后写了一个同步块,使用 Singleton.class
作为锁对象,在多个线程同时进来的情况下,将第一个锁线程起来,只允许一个线程创建对象。 随后进行了第二次判空,同样是为了保证在多线程的情况下,拦截除第一线程外的所有队列线程
这样避免了多个线程同时通过第一次检查,然后进入同步块,从而提高了性能。
java
if (singleton == null) {
singleton = new Singleton();
}
在第二次判空后就可以创建对象了。
最后返回Singleton,即返回 Singleton 的唯一实例。
这串代码是经典的懒汉式单例模式实现,并在此基础上做了性能优化,使用了双重检查锁和 volatile 关键字。代码中在极大的情况下提高了性能,实现了单例模式。