单例模式的定义

单例模式确保一个类只有一个实例,并提供一个全局唯一访问点

单例模式的类图

单例模式的实现

饿汉式

  • static 变量在类装载的时候进行初始化
  • 多个实例的 static 变量会共享同一块内存区域
    初始化类的时候就创建
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Singleton {

    //构造私有化,防止直接new
    private Singleton(){}

    //静态初始化器(static initializer)中创建实例,保证线程安全
    private static Singleton instance = new Singleton();

    public static Singleton getInstance(){
    return instance;
    }
    }
    饿汉式是线程安全的,JVM在加载类时马上创建唯一的实例对象,且只会装载一次。

懒汉式

单例模式的懒汉式实现方式体现了延迟加载的思想(延迟加载也称懒加载Lazy Load,就是一开始不要加载资源或数据,等到要使用的时候才加载)

同步方法

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton {
private static Singleton singleton;

private Singleton(){}

//解决了线程不安全问题,但是效率太低了,每个线程想获得类的实例的时候,都需要同步方法
public static synchronized Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}

双重检查加锁

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

//volatitle关键词确保,多线程正确处理singleton
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton ==null){
synchronized (Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}

静态内部类

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

private Singleton(){}

private static class SingletonInstance{
private static final Singleton INSTANCE = new Singleton();
}

public static Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
}