6种单例模式
Posted 小谢backup
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6种单例模式相关的知识,希望对你有一定的参考价值。
共有6种方法:懒汉式、加锁、double check lock、饿汉式、内部静态类、枚举类。其中除了懒汉式不安全外,其它都安全,理想用的是静态内部类的方式。
方法一:懒汉式
1class SingleTon {
2
3 private SingleTon() {
4
5}
6
7
8private static SingleTon instance = null;
9
10
11public static SingleTon getInstance() {
12
13 if (instance == null) {//线程不安全
14
15 instance = new SingleTon();
16
17 }
18
19 return instance;
20
21 }
22}
方法二:加锁
1class SingleTon {
2
3 private SingleTon() {
4
5}
6
7
8
9private static SingleTon instance = null;
10
11
12
13public static SingleTon getInstance() {
14
15 synchronized (SingleTon.class) {//加锁保证线程安全,缺点是每次都要加锁
16
17 if (instance == null) {
18
19 instance = new SingleTon();
20
21 }
22
23 }
24
25 return instance;
26
27 }
28
29}
方法三:double check lock(DCL)+volatile
该方法是懒汉式系列的最佳实践,但是有些复杂,加锁也会有影响性能。
1class SingleTon {
2
3 private SingleTon() {
4
5}
6
7
8
9private static volatile SingleTon instance = null;//加监控,保证内存可见性。
10
11
12
13public static SingleTon getInstance() {//要加static,因为是直接调用的,构造函数已经私有了
14
15 if (instance == null) {//先判断是否为空,避免总是加锁
16
17 synchronized (SingleTon.class) {//加锁保证线程安全
18
19 if (instance == null) {
20
21 instance = new SingleTon();
22
23 }
24
25 }
26
27 }
28
29
30
31 return instance;
32
33 }
34}
方法四:饿汉式
缺点是立即实例创建时机过早,做不到懒加载。
1class SingleTon {
2
3private SingleTon() {}
4
5private static SingleTon instance = new SingleTon();
6
7public static SingleTon getInstance() {
8
9 return instance;
10
11 }
12
13}
方法五:静态内部类(推荐)
延迟初始化
1class SingleTon {
2
3private SingleTon() {}
4
5private static class InnerClass {
6
7 private static final SingleTon instance = new SingleTon();
8
9}
10
11
12
13 public static SingleTon getInstance() {
14
15 return InnerClass.instance;
16
17 }
18
19}
方法六:枚举类
1enum SingleTon {
2
3 INSTANCE;
4
5 public void someMethod() {
6
7 }
8}
以上是关于6种单例模式的主要内容,如果未能解决你的问题,请参考以下文章