什么是Singleton

  • Singleton在Java中即指单例设计模式,它是软件开发中最常用的设计模式
  • 单 唯一
  • 例 实例
  • 单例设计模式,即某个类崽之整个系统中只能有一个实例对象可被获取和使用的代码模式
  • 例如:代表JVM运行环境的Runtime类

要点

  • 某个类只能有一个实例
    • 构造器私有化
  • 必须自行创建这个实例
    • 含有一个该类的静态变量来保存这个唯一实例
  • 必须自行向整个系统提供这个实例
    • 对外提供获取该实例对象的方式
      1. 直接暴露
      2. 用静态变量的get方法获取

常见形式

  • 饿汉式:直接创建对象,不存在线程安全问题
    1. 直接实例化饿汉式(简介直观)
    2. 枚举式
    3. 静态代码块饿汉式(适合复杂实例化)
  • 懒汉式:延迟创建对象
    1. 线程不安全(适用于单线程)
    2. 线程安全(适用于多线程)
    3. 静态内部类形式(适用于多线程)

代码

  • 创建一个单例的类,并且构造起私有化
1
2
3
public class Singleton {
private Singleton() {}
}
  • 直接实例化饿汉式
1
public static final Singleton INSTANCE = new Singleton();
  • 枚举式
1
2
3
public enum Singleton {
INSTANCE
}
  • 静态代码块饿汉式(适合复杂实例化)
1
2
3
4
public static final Singleton INSTANCE;
static {
INSTANCE = new Singleton();
}
  • 线程不安全(适用于单线程)
1
2
3
4
5
6
7
static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
  • 线程安全(适用于多线程)
1
2
3
4
5
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
  • 静态内部类形式(适用于多线程)
1
2
3
4
5
6
private static class Inner {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Inner.INSTANCE;
}