单例设计模式

版电力系统故障录波_故障录波识图与典型故障波形分析 1、设置故障录波的目的故障录波装置是对电力系统运行状况进行监控的一种自动化设备。系统正常运行时,录波装置不启动录波,当系统发生故障时,通过启动录波装置迅速启动录波器录波,直接记录反应故障装置安装处系统故障的电气量。2、故障录波的作用(1)正确评价继电保护和自动装置的工作。(2)正确分析事故的原因并研究防止对侧。(3)发现继电保护和自动装置缺陷。(4)发现一次设备缺陷,及时消除隐患。(5)帮助寻找故... 阅读详情

单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例

优点:不会频繁地创建和销毁对象,浪费系统资源。

使用场景:IO 、数据库链接、Redis 连接等。

单例模式的实现方式

主要有饿汉式  懒汉式 静态内部类  枚举

饿汉式:

package com.sky.designpattern.singleton;

/**
 * @author sky
 * @Description 饿汉式
 * 类加载到内存后,就是李华一个单例,JVM保证线程安全
 * 简单实用,推荐使用
 * 唯一缺点,不管用到与否,类装在时就完成实例化
 *
 * @date 2023/5/10 23:35
 */
public class Mgr01 {
    private  static final Mgr01 INSTANCE=new Mgr01();

    private Mgr01() {
    }

    public static Mgr01 getInstance(){return INSTANCE;}

    public static void main(String[] args) {
        Mgr01 m1=Mgr01.getInstance();
        Mgr01 m2=Mgr01.getInstance();
        System.out.println(m1==m2);
    }
}

静态代码块:

package com.sky.designpattern.singleton;

/**
 * @author sky
 * @Description 静态代码块
 * 
 * @date 2023/5/10 23:35
 */
public class Mgr02 {
    private  static final Mgr02 INSTANCE;
    static{
        INSTANCE=new Mgr02();
    }
    private Mgr02() {
    }

    public static Mgr02 getInstance(){return INSTANCE;}

    public static void main(String[] args) {
        Mgr02 m1= Mgr02.getInstance();
        Mgr02 m2= Mgr02.getInstance();
        System.out.println(m1==m2);
    }
}

懒汉式1:线程不安全不推荐

package com.sky.designpattern.singleton;

/**
 * @author sky
 * @Description 懒汉式
 * 虽然达到了按需初始化的目的,但却带来线程不安全的问题
 * @date 2023/5/10 23:35
 */
public class Mgr03 {
    private static Mgr03 INSTANCE;

    private Mgr03() {
    }

    public static Mgr03 getInstance() {
        if (INSTANCE == null) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            INSTANCE = new Mgr03();
        }
        return INSTANCE;
    }

    public static void main(String[] args) {

        for(int i=0;i<100;i++){
            new Thread(()->{
                System.out.println(Mgr03.getInstance().hashCode());
            }).start();
        }
    }
}

懒汉式2:加锁,但是效率较低,也不推荐

package com.sky.designpattern.singleton;

/**
 * @author sky
 * @Description 懒汉式
 * 虽然达到了按需初始化的目的,但却带来线程不安全的问题
 * 可以通过synchronized加锁解决,但是会带来效率降低
 * @date 2023/5/10 23:35
 */
public class Mgr04 {
    private static Mgr04 INSTANCE;

    private Mgr04() {
    }

    public static synchronized Mgr04 getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Mgr04();
        }
        return INSTANCE;
    }

    public static void main(String[] args) {

        for(int i=0;i<100;i++){
            new Thread(()->{
                System.out.println(Mgr04.getInstance().hashCode());
            }).start();
        }
    }
}

懒汉式3:加锁,但是没有双重校验,也会重复创建对象

package com.sky.designpattern.singleton;

/**
 * @author sky
 * @Description 懒汉式
 * 虽然达到了按需初始化的目的,但却带来线程不安全的问题
 * 可以通过synchronized加锁解决,但是会带来效率降低
 * @date 2023/5/10 23:35
 */
public class Mgr05 {
    private static Mgr05 INSTANCE;

    private Mgr05() {
    }

    public static Mgr05 getInstance() {
        if (INSTANCE == null) {
            //多线程执行时,等待锁的时候别人实例化好了,这里没有判断实力是否为空,所以会重复执行
            synchronized (Mgr05.class) {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                INSTANCE = new Mgr05();
            }
        }
        return INSTANCE;
    }

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                System.out.println(Mgr05.getInstance().hashCode());
            }).start();
        }
    }
}

懒汉式4:双重校验,推荐

指令重排可能会破坏单例,可以通过volatile关键字防止指令重排

package com.sky.designpattern.singleton;

/**
 * @author sky
 * @Description 懒汉式
 * 虽然达到了按需初始化的目的,但却带来线程不安全的问题
 * 可以通过synchronized加锁解决,但是会带来效率降低
 * @date 2023/5/10 23:35
 */
public class Mgr06 {
    private volatile static Mgr06 INSTANCE; //使用volatile关键字进行修饰,防止指令重排/**

    private Mgr06() {
    }

    public static Mgr06 getInstance() {
        if (INSTANCE == null) {
            //多线程执行时,等待锁的时候别人实例化好了,这里没有判断实力是否为空,所以会重复执行
            //双重检查
            synchronized (Mgr06.class) {
                if (INSTANCE == null) {
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    INSTANCE = new Mgr06();
                }
            }
        }
        return INSTANCE;
    }

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                System.out.println(Mgr06.getInstance().hashCode());
            }).start();
        }
    }
}

静态内部类:推荐

package com.sky.designpattern.singleton;

/**
 * @author sky
 * @Description 静态内部类 jvm保证单例
 * 加载外部类的时候不会加载内部类,这样可以实现懒加载
 * @date 2023/5/10 23:35
 */
public class Mgr07 {
    private Mgr07() {
    }

    private static class Mgr07Holder {
        private final static Mgr07 INSTANCE = new Mgr07();
    }

    public static Mgr07 getInstance() {
        return Mgr07Holder.INSTANCE;
    }

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                System.out.println(Mgr07.getInstance().hashCode());
            }).start();
        }
    }
}

枚举:推荐,还可以防止反序列化

package com.sky.designpattern.singleton;

/**
 * @author sky
 * @Description 枚举代理 不仅可以解决线程同步 还可以防止反序列化
 * @date 2023/5/10 23:35
 */
public enum Mgr08 {
    INSTANCE;

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                System.out.println(Mgr08.INSTANCE.hashCode());
            }).start();
        }
    }
}

那些方式可以破坏单例?

反射调用构造函数:单例模式,私有化构造函数,只能内部创建对象,但是通过反射,可以打破单例模式。

可以修改构造函数,防止反射破坏单例

package com.sky.designpattern.singleton;

/**
 * @author sky
 * @Description 懒汉式
 * 虽然达到了按需初始化的目的,但却带来线程不安全的问题
 * 可以通过synchronized加锁解决,但是会带来效率降低
 * @date 2023/5/10 23:35
 */
public class Mgr05 {
    private static Mgr05 INSTANCE;

    private Mgr05() {
        if(INSTANCE!=null){
            throw new RuntimeException("组织反射破坏单例");
        }
    }

    public static Mgr05 getInstance() {
        if (INSTANCE == null) {
            //多线程执行时,等待锁的时候别人实例化好了,这里没有判断实力是否为空,所以会重复执行
            synchronized (Mgr05.class) {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                INSTANCE = new Mgr05();
            }
        }
        return INSTANCE;
    }

    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                System.out.println(Mgr05.getInstance().hashCode());
            }).start();
        }
    }
}

序列化反序列化

反射在通过 newInstance 创建对象时,会检查该类是否被 ENUM 修饰,如果是则直接抛出异常,反射失败,所以枚举是不怕反射暴力破解构造器的

枚举可以防止序列化反序列化重复创建对象。

  • 序列化的时候,仅仅是将枚举对象的 name 属性输出到结果中
  • 反序列化的时候则是通过 java.lang.Enum 的 valueOf 方法 来根据 name 查找枚举对象
Cartographer从安装到实战:手把手教你运行2D/3D建图与定位 本文提供了一份详尽的Cartographer从零安装到实战应用的完整指南。内容涵盖环境准备、依赖编译、源码构建等关键步骤,并手把手指导读者运行2D/3D官方数据集进行建图与定位测试。文章深入解析了参数配置与自定义数据适配方法,帮助开发者快速掌握这一强大的实时同步定位与建图工具,并将其应用于机器人导航与自动驾驶等实际场景。 阅读详情

相关推荐

ROS2+PYTHON VENV虚拟环境配置方法

ROS2+PYTHON VENV配置方法本篇针对的是python。

下雨夏云的博客 554

Java 单例设计模式

Java单例设计模式 一、什么是单例设计模式 单例设计模式,就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 二、如何应用单例设计模式 根据定义,一个类只能存在一种对象实例,所以我们需将类的构造访问权限设置成private,只能在类内进行操作。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象, 静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。 三、单例设计

枯寂家博客 1407

CRPR的三种关键影响:从SI、OCV到Min Pulse Width的时序优化实践

本文深入探讨了CRPR(时钟重汇聚悲观度消除)在芯片时序优化中的三种关键影响:信号完整性(SI)、片上变异(OCV)和最小脉宽检查。通过实际案例分析和技术细节,展示了CRPR如何有效修正时序分析中的过度保守估计,提升设计精度。文章特别强调了SI-aware CRPR的调试技巧和OCV补偿的最佳实践,为芯片设计工程师提供了宝贵的时序优化指导。

weixin_30920853的博客 377

单例设计模式的个人理解

1:模式:解决一类问题的固定步骤. 需求 :保证一个类中在内存中只有一个对象 (hadoop分布式文件存储系统技术.) 饿汉单例设计模式: 1.私有化本类的构造函数 2,声明本类的引用类型变量.使用 private static 来修饰.并创建本类的对象. 3.提供一个公共的方法来获取本类的对象. 代码: class Single{ private static Single

javaStudent的博客 435

基于TL431与光耦的电压反馈环路优化设计实战

本文深入探讨了基于TL431与光耦的电压反馈环路优化设计实战。文章从理解这对“黄金搭档”的工作原理入手,详细拆解了电压采样电阻网络、偏置电路、光耦工作点设置以及动态补偿网络的设计心法与计算步骤。重点分享了如何通过RC补偿网络调试,确保环路在各种负载下稳定可靠,并提供了关键的实战避坑指南,帮助工程师解决电源设计中常见的振荡、噪声及可靠性问题。

nginx7reverse的博客 776

天线学习笔记——串馈网络设计

工程中通常更倾向于使用50Ω、70.7Ω、100Ω的固定阻抗的带宽,实际中可以分别使用固定阻抗的带宽和计算得到的带宽进行仿真,观察二者的性能,取性能更优者即可。本系列是一个记录天线设计的笔记,分享出来也希望能够帮助到大家,后续本系列文章还会不定期更新,如有需要可关注,任何问题均可在评论区或私信提出,看到必回。如果对大家有帮助可进行打赏哦~

Ethan的博客 7875

八种单例设计模式

1.什么是单例设计模式? 单例设计模式就是在整个系统中或者程序中只有一个该对象的应用实例。例如: 2.单例设计模式分类 1.饿汉式 <1>静态常量 --》步骤: 1.声明静态私有的引用类型变量并用final修饰:private static final Single INSTANCE=new Single(); 2.将构造函数私有化,防止new对象 ...

qq_39246966的博客 334

2.4 提示词优化

我们在使用大模型的时候,同一任务使用不同表述的提示词,可能得到差异巨大的结果,因为模型的性能高度依赖输入提示词的质量。我们可以通过提示词优化来更高效地获取理想输出。

从0到1,突破自己 1008

java单例设计模式

单例设计模式 作用:保证一个类在内存中只有一个对象。 模式:模式就是解决一类问题的固定步骤。 饿汉单例设计模式的步骤 私有化构造函数; 声明本类的引用类型变量,并且使用该变量指向本类对象; 提供一个公共静态的方法获取本类的对象; /** * 饿汉单例设计模式 */ class Single { // (2)声明本类的引用类型变量,并且使用该变量指向本类对象 private static S...

shui_zhong_yue的博客 186

Euro-NCAP-HWA测试流程中文版V1.1(2023发布)

在本协议中,使用了以下术语:Vehicle undertest (VUT) – 指根据本规程测试的车辆,车上有碰撞前的碰撞缓解或避免系统Global VehicleTarget (GVT) – 指本协议中使用的车辆目标,其定义见TB025—Euro-NCAP全球车辆目标规范v1.0辅助其他车辆(SOV)--指最新的 AEB VRU 测试规程中定义的 "大型障碍车辆"(而非机器人控制的平台),用于本规程中的 "切出 "测试。Time To Collision (TTC) – 指在VUT碰撞GVT之前的剩余时间

小明师兄的博客 595

livox雷达斜装修改

指的是,使用外部的陀螺仪的话,雷达到外部陀螺仪的转换,而mid360的陀螺仪是内置在360里面的,且方向和点云方向是一致的,所以不能通过修改此处去改变陀螺仪方向。同时livox_ros_driver2中的MID360_config.json里面的。这里面的外参,只能改变点云相对陀螺仪的位姿,而不能将陀螺仪映射到你期望的倾斜角度。fast_lio中的mid360.yaml中的外参。

z1872385的博客 2707

单例设计模式总结

1为什么要用单例设计模式 2几种单例设计模式2.1懒汉式2.1.1双重校验锁并不能保证安全 2.1.2,使用volelite关键词 2.1.3,ThreadLocal修复双重检测 2.2最安全的单例-饿汉式 3枚举单例 1为什么要用单例设计模式        在我们开发过程中有时候对于某个类的实例只能有一个,也就是说该类只能被创建一次,别人想用只能用这个实例。这个在我们数据库的操作就是单例的一个体

江南的博客 468

国科大学习资料--计算机视觉--期末考试解析

国科大学习资料–计算机视觉(胡占义)–期末考试解析 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

无名何许人的博客 2463

java的单例设计模式

java的单例设计模式单例设计模式饿汉式设计模式懒汉式设计模式理解main方法的语法 文章内容选自尚硅谷,jdk8,eclipse环境。 单例设计模式 单例设计模式就是java的某一类只能产生一个对象,要想实现只有一个对象,那就得把类的构造器声明为private,这样就无法从外部new多个对象了。 既然不能从外部new对象,但是可以从内部类内的方法中创建对象,为了保证创建的对象只有一个,把创建对象的方法声明为静态的,目的是为了从类名调用方法。静态的方法返回一个对象,因为静态方法只能调用静态的方法和属性,同时

Meloneating的博客 723

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java中单例设计模式详解

在Java编程中,单例设计模式是一种创建对象的设计模式,它保证一个类仅有一个实例,并提供一个全局访问点来访问这个唯一实例。单例模式在很多场景下都非常有用,比如配置文件读取、线程池管理、缓存管理等。下面,我们将详细讲解Java中的单例设计模式,并通过代码示例帮助初学者理解。

qq_36720723的博客 780

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 多线程异步处理任务(异步下载)
下一篇: 设计模式之策略模式
bxp1321
博客等级 码龄17年 146粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值