单例模式
饿汉模式
package 设计模式.单例模式.饿汉模式;
/**
* @ProjectName springbootsamples2_3_6
* @Description 提前定义好了instance,调用是直接返回,所以称为饿汉模式
* 优点:单例在类被加载的时候被创建,线程安全,可以用于多线程环境
* 缺点:如果单例未被使用,那么同样会被创建,会造成内存浪费
* @Author yaozhenpeng
* @Time 2022/12/15 15:44
*/
public class EHan {
private EHan(){}
private static EHan instance = new EHan();
public static EHan getInstance(){
return instance;
}
}
懒汉模式
package 设计模式.单例模式.懒汉模式;
/**
* 懒汉式:当调用是采取new 对象,所以称为懒汉模式
* 优点:在需要被使用的时候才被创建,不会造成资源浪费
* 缺点:线程不安全,getInstance方法没有同步,在多线程的情况下会造成创建的实例不同
*/
public class LHan {
private static LHan instance;
private LHan(){}
public static LHan getInstance(){
if(instance == null)
{
instance = new LHan();
}
return instance;
}
}
DCL双检查锁机制-重点
package 设计模式.单例模式.DCL双检查锁机制;
/**
* @ProjectName springbootsamples2_3_6
* @Description
* 线程安全:双检查锁机制即代码使用了 两次检查null,使用volatile可以禁止指令重排序的问题导致创建了两个instance,
* 这样修改instance值后会立即刷新到主内存,取得时候也是从主内存取
* 延时加载:使用时去创建对象
* @Author yaozhenpeng
* @Time 2022/12/15 15:51
*/
public class Dcl {
public Dcl() {
}
private volatile static Dcl instance = null;
public static Dcl getInstance(){
if(instance == null){
synchronized (Dcl.class){
if(instance == null){
instance = new Dcl();
}
}
}
return instance;
}
}
静态内部类
package 设计模式.单例模式.静态内部类;
/**
* @ProjectName springbootsamples2_3_6
* @Description
* 线程安全: 虚拟机会保证一个类的构造器方法在多线程环境中被正确地加载,同步,如果多个线程同时去初始化一个类,那么只有一个线程去执行这个类的
* 延时加载: 由于内部类是隐藏的,所以只要不使用内部类,那么JVM就不会将其加载进来,这样就很好的实现了延迟加载
* 缺点:遇到序列化对象的时候,如果还使用默认的运行方式,就会出现多实例的情况,解决方法是在反序列化中使用readResolve方法
* @Author yaozhenpeng
* @Time 2022/12/15 16:11
*/
public class StaticInClass {
private StaticInClass() {
}
private static class Holder{
public static StaticInClass instance = new StaticInClass();
}
public StaticInClass getInstance(){
return Holder.instance;
}
}
枚举
package 设计模式.单例模式.枚举;
/**
* @ProjectName springbootsamples2_3_6
* @Description 不常见
* @Author yaozhenpeng
* @Time 2022/12/15 16:16
*/
public enum EnumClass {
INSTANCE;
public void someMethod(){
}
}