单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单例模式的6中写法:

饿汉模式:在类加载时就完成了初始化,所以加载较慢,但是对象的获取速度快,避免了多线程同步问题。

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

private static SingleTon instance = new SingleTon();

private SingleTon() {

}

public static SingleTon getInstance() {
return instance;
}
}

懒汉模式:线程不安全,节约了资源,在多线程时不能正常工作。

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

private static SingleTon instance;

private SingleTon() {

}

public static SingleTon getInstance() {
if (instance == null) {
return new SingleTon();
}
return instance;
}
}

线程安全的懒汉模式:能够在多线程下工作,但是每次调用getInstance都需要进行同步,造成的同步开销较大。

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

private static SingleTon instance;

private SingleTon() {

}

public static synchronized SingleTon getInstance() {
if (instance == null) {
return new SingleTon();
}
return instance;
}
}

双重检查模式: 避免了不必要的同步,同时避免创建多余的实例,volatile稍微影响了性能。 第一次加载稍慢,有可能出现失效的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SingleTon {

private volatile static SingleTon instance;

private SingleTon() {

}

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

静态内部类单例模式:第一次加载时不会初始化sInstance,只有第一次调用getInstance方法时才会加载SingleTonHolder并初始化sInstance。不仅能保证线程安全,也能保证SingleTon类的唯一性。(推荐使用)

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


private SingleTon() {

}

public static SingleTon getInstance() {
return SingleTonHolder.sInstance;
}

private static class SingleTonHolder {
private static final SingleTon sInstance = new SingleTon();
}
}

枚举单例: 线程安全,且在任何情况下都是单例,但是可读性不高。

1
2
3
4
5
6
7
8
public enum  SingleTon {

INSTANCE;

public void doSomeThing(){

}
}

本文地址: http://www.yppcat.top/2019/04/12/单例模式/