可以分成两类: 多线程安全和非多线程安全的单例
一. 多线程安全#
1 . initialization-on-demand holder idiom(IODH)
// 用内部类的机制实现了延时加载和线程安全
1 | public class Singleton { |
通过枚举实现
1
2
3public enum EnumSingleton implements Serializable {
INSTANCE;
}double check模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public 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;
}
}
二. 非多线程安全#
- lazy load模式
1
2
3
4
5
6
7
8
9
10
11public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
} - 非lazy load模式
1
2
3
4
5
6
7
8
9
10public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
三. 应用#
系统中只有一个HttpClient单例,其他模块共享这个单例, 在高并发的情况下提高性能。
spring容器scope中的单例。