多线程环境下的单例

Posted by Simon Dong on 2014-09-09

使用双重检查锁(Double-checked Locking)实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
}
}

JDK5之前,volatile并不保证写都将先行发生于读,但JDK5之后,JDK保证了这种用途。
否则,将会发生读取了初始化一半的_instance实例。

枚举实现

基于枚举的实例化过程是线程安全的,因此所实现的单例也是安全的,但在枚举中的其它方法的线程安全性由程序员负责。

1
2
3
public enum Singleton{
INSTANCE;
}

静态方法实现

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

private Singleton(){

}

public static Singleton getInstance(){
return _instance;
}
}

注意:_instance的声明必须是final的,静态的。

静态持有者模式(Initialization on demand Holder)

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton {

private Singleton() {
}

private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}

public static Singleton getInstance() {
return SingletonHolder.instance;
}
}

实例在第一次访问时初始化。