零、 本文纲要
- 一、 单例模式
- 饿汉式
① 静态变量方式
② 静态代码块
③ 枚举 - 懒汉式
① 静态方法(线程不安全)
② 静态synchronized方法(线程安全)
③ 静态方法双检锁(线程不安全)
④ 静态方法双检锁volatile优化(线程安全)
⑤ 静态内部类(线程安全)
- 二、 单例模式问题解决
- 防止序列化破坏单例
- 防止反射破坏单例
- 三、 JDK中存在的单例模式
java.lang.Runtime类
一、 单例模式
1. 饿汉式
- ① 静态变量方式
Ⅰ 私有构造private Singleton() {}
Ⅱ 静态变量private static Singleton instance = new Singleton();
Ⅲ 静态方法获取单例public static Singleton getInstance() { return instance; }
/**
* 饿汉式
* 静态变量创建类的对象
*/
public class Singleton {
//私有构造方法
private Singleton() {}
//在成员位置创建该类的对象
private static Singleton instance = new Singleton();
//对外提供静态方法获取该对象
public static Singleton getInstance() {
return instance;
}
}
- ② 静态代码块
Ⅰ 私有构造
Ⅱ 静态变量
Ⅲ 静态代码块赋值
Ⅳ 静态方法获取对象
/**
* 饿汉式
* 在静态代码块中创建该类对象
*/
public class Singleton {
//私有构造方法
private Singleton() {}
//在成员位置创建该类的对象
private static Singleton instance;
static {
instance = new Singleton();
}
//对外提供静态方法获取该对象
public static Singleton getInstance() {
return instance;
}
}
- ③ 枚举
/**
* 枚举方式
*/
public enum Singleton {
INSTANCE;
}
2. 懒汉式
- ① 静态方法(线程不安全)
/**
* 懒汉式
* 线程不安全
*/
public class Singleton {
//私有构造方法
private Singleton() {}
//在成员位置创建该类的对象
private static Singleton instance;
//对外提供静态方法获取该对象
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
存在问题:
Ⅰ 多线程下单例难以保证
sequenceDiagram
participant t1 as Thread1
participant t2 as Thread2
t1->t1:instance == null
t1->>+t2:Thread1时间片耗尽,Thread2使用CPU
t2->t2:instance == null<br>instance = new Singleton()<br>return instance
t2->>-t1:Thread2使用完CPU,Thread1分配使用
t1->t1:instance = new Singleton()<br>return instance
作者:石头耳东
链接:https://www.jianshu.com/p/054a20cee6ce
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。