第一种(懒汉,线程不安全):
1
public
class
Singleton {
2 private static Singleton instance;
3 private Singleton (){}
4 public static Singleton getInstance() {
5 if (instance == null ) {
6 instance = new Singleton();
7 }
8 return instance;
9 }
10 }
11
2 private static Singleton instance;
3 private Singleton (){}
4 public static Singleton getInstance() {
5 if (instance == null ) {
6 instance = new Singleton();
7 }
8 return instance;
9 }
10 }
11
这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。
第二种(懒汉,线程安全):
1
public
class
Singleton {
2 private static Singleton instance;
3 private Singleton (){}
4 public static synchronized Singleton getInstance() {
5 if (instance == null ) {
6 instance = new Singleton();
7 }
8 return instance;
9 }
10 }
11
2 private static Singleton instance;
3 private Singleton (){}
4 public static synchronized Singleton getInstance() {
5 if (instance == null ) {
6 instance = new Singleton();
7 }
8 return instance;
9 }
10 }
11
这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。
第三种(双重校验锁):
1
public
class
Singleton {
2 private volatile static Singleton singleton;
3 private Singleton (){}
4 public static Singleton getSingleton() {
5 if (singleton == null ) {
6 synchronized (Singleton. class ) {
7 if (singleton == null ) {
8 singleton = new Singleton();
9 }
10 }
11 }
12 return singleton;
13 }
14 }
15
2 private volatile static Singleton singleton;
3 private Singleton (){}
4 public static Singleton getSingleton() {
5 if (singleton == null ) {
6 synchronized (Singleton. class ) {
7 if (singleton == null ) {
8 singleton = new Singleton();
9 }
10 }
11 }
12 return singleton;
13 }
14 }
15