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种单例模式的主要内容,如果未能解决你的问题,请参考以下文章

六种单例模式

八种单例模式分析

C#中几种单例模式

五种单例模式

如何写一个简单的单例模式?

设计模式 - 创建型模式_7种单例模式实现