1. 在了解单例模式前,首先我们需要知道什么是单例模式?
- 即确保一个类只有一个实例,并且提供实例的一个全局访问点
2. 单例模式类图
3. 下面介绍下单例模式的几种实现方式
- 懒汉式
- 饿汉式
- 静态代码块
- 静态内部类
- 双重检测锁
- 枚举
3.1 懒汉式
- 在调用getInstance()时才会初始化
- 但是线程不安全
/*
由于要确保单例唯一实例,因此要控制对象的创建
可以用过使用构造方法来对外界不可见
*/
public class MySingleton1 {
private static MySingleton1 instance;
private MySingleton1(){}
public static synchronized MySingleton1 getInstance(){
if (instance == null){
instance = new MySingleton1();
}
return instance;
}
}
3.2 饿汉式
- 线程安全
- 在新建对象时就对getInstance()进行初始化,如果没有使用该实例,则会造成资源浪费
public class MySingleton2 {
private final static MySingleton2 instance = new MySingleton2();
private MySingleton2(){}
public static MySingleton2 getInstance(){
return instance;
}
}
3.3 静态代码块
public class MySingleton3 {
private static MySingleton3 instance = null;
private MySingleton3(){}
static {
instance = new MySingleton3();
}
public static MySingleton3 getInstance(){
return instance;
}
}
3.4 静态内部类
public class MySingleton4 {
private MySingleton4(){}
private static MySingleton4 getInstance(){
return Inner.instance;
}
private static class Inner{
private static final MySingleton4 instance = new MySingleton4();
}
}
3.5 双重检测锁
- getInstance()方法会在创建前检查私有的MySingleton实例成员两次,看它是否为null
public class MySingleton5 {
private volatile MySingleton5 instance;
private MySingleton5(){ }
public MySingleton5 getInstance(){
if (instance == null){
synchronized (MySingleton5.class){
if (instance == null)
instance = new MySingleton5();
}
}
return instance;
}
}
3.6 枚举
public enum MySingletonEnum {
INSTANCE;
}
//在该示例中,对单例对象实例的引用使用过如下方式获得
/*
MySingletonEnum mse = MySingletonEnum.INSTANCE;
mse.doSomething...
*/
单例模式