A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。
单例模式有很多种写法,大部分写法都或多或少有一些不足。下面将分别对这几种写法进行介绍。

1、饿汉模式

public class SingletonDemo1 {

  //类初始化时,立即加载这个对象(没有延时加载的优势)。加载类时,天然的是线程安全的!
  private static SingletonDemo1 instance = new SingletonDemo1();  

  private SingletonDemo1(){
  }

  //方法没有同步,调用效率高!
  public static SingletonDemo1  getInstance(){
          return instance;
  }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2、懒汉模式

public class SingletonDemo2 {
       
        //类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)。
        private static SingletonDemo2 instance;  
       
        private SingletonDemo2(){ //私有化构造器
        }
       
        //方法同步,调用效率低!
        public static  synchronized SingletonDemo2  getInstance(){
                if(instance==null){
                        instance = new SingletonDemo2();
                }
                return instance;
        }
       
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3、双重校验锁

public class SingletonDemo3 {

  private static SingletonDemo3 instance = null;

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

  private SingletonDemo3() {

  }

}

//volatile关键字


public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
4、静态内部类

public class SingletonDemo4 {
       
        private static class SingletonClassInstance {
                private static final SingletonDemo4 instance = new SingletonDemo4();
        }
       
        private SingletonDemo4(){
        }
       
        //方法没有同步,调用效率高!
        public static SingletonDemo4  getInstance(){
                return SingletonClassInstance.instance;
        }
       
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
5、枚举

public enum SingletonDemo5 {
       
        //这个枚举元素,本身就是单例对象!
        INSTANCE;
       
        //添加自己需要的操作!
        public void singletonOperation(){
        }
       
       
}
---------------------
【转载,仅作分享,侵删】
作者:imxlw00
原文:https://blog.csdn.net/imxlw00/article/details/85988878


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马