单例模式

介绍

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

提示:
1. 单例只能有一个实例
2. 单例必须创建自己的唯一实例
3. 单例必须给所有的其他对象提供这一实例

实现

懒汉模式(线程不安全的)

这种是最基本的一种实现,是一种lazy loading,但是最大的问题是不支持多线程,没有加锁,所以严格意义上不是单例

1
2
3
4
5
6
7
8
9
10
11
public class Singleton
private static Singleton instance;
private Singleton(){}

public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}

懒汉模式(线程安全的,)

这种是具备线程安全的懒加载, 能在多线程工作,但是效率低,因为大部分情况下不需要同步

1
2
3
4
5
6
7
8
9
10
11
public class Singleton
private static Singleton instance;
private Singleton(){}

public static synchronized Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}

饿汉式

这种是classloader的机制,避免了多线程同步问题. 但是类加载的时候就初始化了,浪费内存.

1
2
3
4
5
6
7
8
9

public class Singleton
private static Singleton instance = new Singleton();
private Singleton(){}

public static Singleton getInstance(){
return instance;
}

双检锁(DCL, double-checked locking)

这种也是一种懒加载方式,这种采用了双锁的方式,安全且在多线程情况下能保持多性能.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Singleton
private static Singleton instance;
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
public class Singleton {  
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}