线程安全的单例模式

第一种:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class SyncSingleton01 {

private static SyncSingleton01 singleton01 = new SyncSingleton01();

private SyncSingleton01() {

}

public static SyncSingleton01 getInstance() {
return singleton01;
}

}

​ 这种方式虽然可以实现线程安全的单例模式,但是如果一个系统中这样的类存在较多的话,会拖慢系统启动的速度,所以,一般会使用延迟加载,在第一次使用的时候才初始化。

第二种:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SyncSingleton02 {

private static SyncSingleton02 singleton02 = null;

private SyncSingleton02() {

}

public static synchronized SyncSingleton02 getInstance() {
if (null == singleton02) {
singleton02 = new SyncSingleton02();
}
return singleton02;
}

}

​ 这种方法锁的粒度比较大,而且在后面的每次获取这个对象的时候,都要进行上锁,效率自然也会是比较低的。

第三种:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SyncSingleton03 {

private static SyncSingleton03 singleton03 = null;

private SyncSingleton03() {

}

public static SyncSingleton03 getInstance() {
if (null == singleton03) {
synchronized (SyncSingleton03.class) {
if (null == singleton03) {
singleton03 = new SyncSingleton03();
}
}
}
return singleton03;
}

}

​ 这种方法采用了双重锁机制对第二种做了修改,减小了锁的粒度,在第一次调用之后,在获取对象的时候不需要再进行上锁。

第四种:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SyncSingleton04 {

private SyncSingleton04() {

}

private static class Inner{
private static SyncSingleton04 singleton04 = new SyncSingleton04();
}

public static SyncSingleton04 getInstance() {
return Inner.singleton04;
}

}

​ 这种方式采用了无锁内部类的形式,也实现了懒加载,是较为优秀的实现方式。