当前位置: 首页 > article >正文

单例设计模式---懒汉式--线程安全和不安全、枚举类

单例设计模式—懒汉式–线程安全和不安全

优点
资源利用率高:只有在真正需要使用单例实例时才进行创建,避免了在应用启动时就占用不必要的资源。
缺点
线程安全问题:在多线程环境下,如果多个线程同时调用获取实例的方法,可能会导致创建多个实例,破坏单例模式的规则。需要额外的同步机制来保证线程安全,但这可能会带来一定的性能开销。

线程不安全

//懒汉式 线程不安全
public class Singleton {
    //私有构造方法
    private Singleton(){}
    //声明Singleton类型的变量instance
    private static Singleton instance;//只是声明了该类型的变量,并没有创建
    //对外提供访问方式
    public static Singleton getInstance(){
        //判断instance是否为null,如果为null,说明还没有创建Singleton类的对象
        //如果没有创建一个并返回。如果有,直接返回
        if(instance == null){
            //线程1等待,线程2获取到cpu的执行权,也会进入到该判断里面
            //多线程执行时,只要线程停留在这里,其他线程就可以进入,那么就不是单实例模式
            instance = new Singleton();
        }
        instance=new Singleton();
        return instance;
    }
}

public class Client {
    public static void main(String[] args) {
        Singleton instance =Singleton.getInstance();
        Singleton instance1 =Singleton.getInstance();
        //判断两次获取到的Singleton对象是否是同一个对象
        System.out.println(instance==instance1);
    }
}


线程安全

//线程安全,依据以上线程不安全做修改
public class Singleton {
    //私有构造方法
    private Singleton(){}
    //声明Singleton类型的变量instance
    private static Singleton instance;//只是声明了该类型的变量,并没有创建
    //对外提供访问方式
    public static synchronized Singleton getInstance(){
       
        if(instance == null){
            instance = new Singleton();
        }
        instance=new Singleton();
        return instance;
    }
}

枚举类
饿汉式枚举类是实现单例模式的一种高效且安全的方式。
枚举类型在 Java 中是一种特殊的类,它的实例是有限且固定的。当使用枚举类实现单例模式时,枚举类的实例在类加载时就会被创建,并且是唯一的,这符合饿汉式单例的特点,即在类加载时就初始化单例实例。同时,Java 语言规范保证了枚举类型的实例是线程安全的,并且可以防止反射攻击和反序列化时创建新的实例。

package patten.demo6;
//饿汉式 枚举类
public enum Singleton {
    INSTANCE;
}

枚举类测试

public class Client {
    public static void main(String[] args) {
        Singleton instance = Singleton.INSTANCE;
        Singleton instance1 = Singleton.INSTANCE;
        //判断两次获取到的Singleton对象是否是同一个对象
        System.out.println(instance==instance1);
    }

}


http://www.kler.cn/a/577769.html

相关文章:

  • 用AI学编程4——swift学习1
  • Mac软件卸载后启动台图标还在
  • 基于深度学习的恶意软件检测系统:设计与实现
  • springmvc_view介绍
  • 4、STL的deque使用方法
  • SpringBoot知识点及其源码解析(3)
  • 华为eNSP:实验 OSPF单区域
  • 4.归一化技术:深度网络中的关键优化手段——大模型开发深度学习理论基础
  • 2025-03-08 学习记录--C/C++-C 语言 判断一个数是否是完全平方数
  • Naive UI 更换主题颜色
  • 《安富莱嵌入式周报》第351期:DIY半导体制造,工业设备抗干扰提升方法,NASA软件开发规范,小型LCD在线UI编辑器,开源USB PD电源,开源锂电池管理
  • LDR6500 PD 协议芯片的运用场景
  • uniapp 自定义地图组件(根据经纬度展示地图地理位置)
  • Web开发-PHP应用Cookie脆弱Session固定Token唯一身份验证数据库通讯
  • windows 平台如何点击网页上的url ,会打开远程桌面连接服务器
  • 第十二届蓝桥杯 异或数列
  • 【大模型理论篇】--Mixture of Experts架构
  • C语言学习笔记-进阶(6)字符串函数2
  • 2025-03-08 学习记录--C/C++-PTA 习题10-3 递归实现指数函数
  • 解决电脑问题(2)——主板问题