单例模式

本文摘自维基百科

单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。
—— 维基百科

实现单例模式的思路:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

通常单例模式在Java语言中,有两种构建方式:

  • 懒汉方式:指全局的单例实例在第一次被使用时构建。
  • 饿汉方式:指全局的单例实例在类装载时构建。

Java
在Java语言中,单例模式(饿汉模式)应用的例子如下述代码所示:

1
2
3
4
5
6
7
8
9
10
11
public class Singleton {
private final static Singleton INSTANCE = new Singleton();

// Private constructor suppresses
private Singleton() {}

// default public constructor
public static Singleton getInstance() {
return INSTANCE;
}
}

在Java编程语言中,单例模式(懒汉模式)应用的例子如下述代码所示 (此种方法只能用在JDK5及以后版本(注意 INSTANCE 被声明为 volatile),之前的版本使用“双重检查锁”会发生非预期行为[1]):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

public class Singleton {
private static volatile Singleton INSTANCE = null;

// Private constructor suppresses
// default public constructor
private Singleton() {}

//thread safe and performance promote
public static Singleton getInstance() {
if(INSTANCE == null){
synchronized(Singleton.class){
//when more than two threads run into the first null check same time, to avoid instanced more than one time, it needs to be checked again.
if(INSTANCE == null){
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}