单例模式
介绍
- 模式:创建型
- 意图:保证一个类只有一个实例,并提供一个访问它的全局访问点
- 解决:一个全局使用的类频繁地创建与销毁
- 场景:
- 唯一序列号
- web中的计数器
- I/O与数据库的连接
- ……
实现方式
饿汉式 :静态加载,线程安全
/**
* 单例模式:饿汉式
* 是否Lazy初始化:否
* 是否多线程安全:是
*/
public class Singleton { private static Singleton singleton = new Singleton(); // 构造器私有
private Singleton() {
} // 实例方法
public static Singleton getInstance() {
return singleton;
}
}
Singleton.java
懒汉式:单校验,线程不安全
/**
* 单例模式:懒汉式
* 是否Lazy初始化:是
* 是否多线程安全:否
*/
public class Singleton { private static Singleton singleton; // 构造器私有
private Singleton() { } // 实例方法
public static Singleton getInstance() {
if (singleton == null) {
return new Singleton();
}
return singleton;
}
}
Sington.java
懒汉式:实例方法同步锁,线程安全
/**
* 单例模式:懒汉式
* 是否Lazy初始化:是
* 是否多线程安全:是
*/
public class Singleton { private static Singleton singleton; // 构造器私有
private Singleton() { } // 实例方法
public static synchronized Singleton getInstance() {
if (singleton == null) {
return new Singleton();
}
return singleton;
}
}
Sington.java
懒汉式:双检锁/双重校验锁(DCL,double-checked locking),线程安全
/**
* 单例模式:懒汉式
* 是否Lazy初始化:是
* 是否多线程安全:是
*/
public class Singleton { private static volatile Singleton singleton; // 构造器私有
private Singleton() { } // 实例方法
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
return new Singleton();
}
}
}
return singleton;
}
}
Sington.java
登记式/静态内部类:线程安全
/**
* 单例模式:登记式/静态内部类
* 是否Lazy初始化:是
* 是否多线程安全:是
*/
public class Singleton { // 静态内部类持有
private static class SingletonHolder {
private static final Singleton SINGLETON = new Singleton();
} // 构造器私有
private Singleton() { } // 实例方法
public static Singleton getInstance() {
return SingletonHolder.SINGLETON;
}
}
Sington.java
枚举:线程安全
/**
* 单例模式:枚举
* 是否Lazy初始化:否
* 是否多线程安全:是
*/
public enum Singleton {
SINGLETON
}
Singleton.java