单例设计模式在工作中是用到和见到最多的,分为懒汉模式和饿汉模式。
懒汉 | 加载时创建对象 |
饿汉 | 运行时创建对象 |
0.饿汉模式
package cn.pikas.simple.design;
/**
* @author XiaHeShun
* @since 2021年4月6日11:16:19
*/
public class SingletonHungry {
/**
* 类加载时创建对象
*/
private static final SingletonHungry instance = new SingletonHungry();
/**
* 私有化构造方法
*/
private SingletonHungry() {
}
/**
* 获取实例
*
* @return
*/
public static SingletonHungry getInstance() {
return instance;
}
}
1.懒汉模式 - 线程不安全
package cn.pikas.simple.design;
/**
* @author XiaHeShun
* @since 2021年4月6日11:23:32
*/
public class SingletonLazy {
/**
* 运行时创建对象
*/
private static SingletonLazy instance;
/**
* 私有化构造方法
*/
private SingletonLazy() {
}
/**
* 获取实例
*
* @return
*/
public static SingletonLazy getInstance() {
if (null == instance) {
instance = new SingletonLazy();
}
return instance;
}
}
2.懒汉模式 - 线程安全
package cn.pikas.simple.design;
/**
* @author XiaHeShun
* @since 2021年4月6日11:23:32
*/
public class SingletonLazy {
/**
* 运行时创建对象
* <p>
* volatile 关键字禁止指令重排
*/
private static volatile SingletonLazy instance;
/**
* 私有化构造方法
*/
private SingletonLazy() {
}
/**
* 获取实例
*
* @return
*/
public static SingletonLazy getInstance() {
if (null == instance) {
synchronized (SingletonLazy.class) {
if (null == instance) {
// 1.分配空间给对象
// 2.空间内创建对象
// 3.将对象赋值给instance
// 可能会发生指令重排,顺序变成1->3->2,这样会导致其它线程先读取到的是一个不完整的对象
instance = new SingletonLazy();
}
}
}
return instance;
}
}