Java设计模式之单例模式-【懒汉式与饿汉式】

news2024/9/25 23:19:58

1、单例,模式

单例模式属于创建型模式的一种,应用于保证一个类仅有一个实例的场景下,并且提供了一个访问它的全局方法

  • 单例模式的特点:从系统启动到终止,整个过程只会产生一个实例。
  • 单例模式常用写法:懒汉式,饿汉式,注册式,序列化式。

2、懒汉式和饿汉式概念

懒汉式:在需要使用对象的时候,再创建对象,不会提前创建

只有再调用获取实例的时候,才会去初始化实例对象
懒加载:是
是否线程安全:否
备注:可以在静态方法上面添加synchronized关键字,实现线程安全

饿汉式:不管对象使用与否,都会提前把对象创建准备好,方便使用.

类加载时即创建对象,线程安全
优点:执行效率高
缺点:类加载时就初始化,浪费内存资源,懒加载:无

3、实现步骤

1、都声明私有构造方法,使得在类的外部不能调用此方法,限制产生多个对象
2、对外部提供静态调用方法,将创建的对象返回,只能通过类来调用

4、代码

  • 懒汉式
    懒汉式:在需要使用对象的时候,再创建对象,不会提前创建。
package com.hx;

/*
    懒汉式:
        在需要使用对象的时候,再创建对象,不会提前创建。
 */
public class Singleton1 {
    //私有构造方法
    private Singleton1() {
        System.out.println("懒汉式的无参数构造方法,被调用了!");
    }

    //定义静态变量,先不建立对象
    private static Singleton1 singleton = null;

    //懒汉式:定义创建对象的方法
    public static synchronized Singleton1 getInstance() {
        //先判断是否为空
        if (singleton == null) {
            //懒汉式做法,如果未null,才进行创建
            singleton = new Singleton1();
        }
        //返回创建好的对象
        return singleton;
    }
}
  • 饿汉式
    饿汉式:不管对象使用与否,都会提前把对象创建准备好,方便使用
package com.hx;

/*
    饿汉式:
        不管对象使用与否,都会提前把对象创建准备好,方便使用
 */
public class Singleton2 {
    //定义公开的构造方法
    private Singleton2() {
        System.out.println("饿汉式的无参构造方法,被调用了!");
    }

    //定义静态变量接收创建的对象
    private static Singleton2 singleton = new Singleton2();

    //饿汉式:定义静态方法返回已经创建好的对象
    public static Singleton2 getInstance() {
        //返回已经创建好的对象
        return singleton;
    }
}
  • 测试类创建对象
package com.hx;

public class TestSingleton {
    public static void main(String[] args) {
        //使用类名.方法名()创建对象
        //懒汉式
        Singleton1 singleton1 = Singleton1.getInstance();
        System.out.println(singleton1);
        //饿汉式
        Singleton2 singleton2 = Singleton2.getInstance();
        System.out.println(singleton2);
    }
}

在这里插入图片描述

5、懒汉式和饿汉式的区别

  • 1、实例化方面:

    • 懒汉式默认不会实例化,外部什么时候调用什么时候new。
    • 饿汉式在类加载的时候就实例化,并且创建单例对象。
  • 2、线程安全方面:

    • 饿汉式线程安全 ,在线程还没出现之前就已经实例化了,因此饿汉式线程一定是安全的。
    • 懒汉式线程不安全, 因为懒汉式加载是在使用时才会去new 实例的,那么去new的时候是一个动态的过程,是放到方法中实现的,如果这个时候有多个线程访问这个实例,这个时候实例还不存在,还在new,就会进入到方法中,有多少线程就会new出多少个实例。一个方法只能return一个实例,那最终return出哪个呢?是不是会覆盖很多new的实例?这种情况当然也可以解决,那就是加同步锁,避免这种情况发生) 。
  • //懒汉式:定义创建对象的方法
     public static synchronized  Singleton1 getInstance() {
         //先判断是否为空
         if (singleton == null) {
             //懒汉式做法,如果未null,才进行创建
             singleton = new Singleton1();
         }
         //返回创建好的对象
         return singleton;
     }
    
  • 3、执行效率上:

    • 饿汉式没有加任何的锁,因此执行效率比较高。
    • 懒汉式一般使用都会加同步锁,效率比饿汉式差。
  • 4、性能上:

    • 饿汉式在类加载的时候就初始化,不管你是否使用,它都实例化了,所以会占据空间,浪费内存。
    • 懒汉式什么时候需要什么时候实例化,相对来说不浪费内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/688864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32设置为I2C从机模式

STM32设置为I2C从机模式 目录 STM32设置为I2C从机模式前言1 硬件连接2 软件编程3 运行测试3.1 I2C连续写入3.1 I2C连续读取3.1 I2C单次读写测试 4 总结 前言 STM32的I2C作为主机的情况相信很多同学都用过,网上也有很多教程,但是作为从设备使用的例子应该…

【C++ 程序设计】第 9 章:函数模板与类模板

目录 一、函数模板 (1)函数模板的概念 (2)函数模板的示例 (3)函数或函数模板调用语句的匹配顺序 二、类模板 (1)类模板概念 (2)类模板示例 &…

阵列模式综合第三部分:深度学习(附源码)

一、前言 这个例子展示了如何设计和训练卷积神经网络(CNN)来计算产生所需模式的元素权重。 二、介绍 模式合成是阵列处理中的一个重要课题。阵列权重有助于塑造传感器阵列的波束图案,以匹配所需图案。传统上,由于空间信号处理和频…

SSL工作原理

SSL 是一个安全协议,它提供使用 TCP/IP 的通信应用程序间的隐私与完整性。因特网的 超文本传输协议(HTTP)使用 SSL 来实现安全的通信。 在客户端与服务器间传输的数据是通过使用对称算法(如 DES 或 RC4)进行加密的。公…

使用ZenDAS进行Gompertz趋势分析

某项目做了18次测试,每次测试发现的缺陷个数如下表所示: 测试序号 发现缺陷数 1 60 2 96 3 157 4 191 5 155 6 106 7 64 8 335 9 92 10 196 11 109 12 133 13 166 14 129 15 16 16 30 17 19 18 5 对上述的数据在Z…

IPv6手工隧道配置与验证实验

IPv6手工隧道配置与验证实验 【实验目的】 熟悉IPv6手工隧道的概念。 掌握IPv6和IPv4共存的实现方法。 掌握IPv6手工隧道的配置。 验证配置。 【实验拓扑】 实验拓扑如下图所示。 实验拓扑 设备参数如表所示。 设备参数表 设备 接口 IPv6地址 子网掩码位数 默认网…

中间件-netty(1)

netty 前言篇 文章目录 一、IO基础篇1.概念1.1 阻塞(Block)和非阻塞(Non-Block)1.2 同步(Synchronization)和异步(Asynchronous)1.3 BIO 与 NIO 对比1.3.1 面向流与面向缓冲1.3.2 阻塞与非阻塞1.3.3 选择器的问世 2.NIO 和 BIO 如何影响应用程序的设计2.1 API调用2.2 数据处理2…

蓝桥杯专题-试题版-【操作格子】【查找整数】【分解质因数】【高精度加法】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

Spring FrameWork从入门到NB -三级缓存解决循环依赖内幕 (二)

开始用上一篇文章讲到的Spring依赖注入的步骤,用两个例子来推导一下整个过程,举例子有助于了解真相。 先用一个最简单的例子:没有依赖的单例bean的创建。 推导过程是需要上一篇文章的步骤的,要参照步骤一步一步来。 无依赖的单…

Linux内核代码60%都是驱动?驱动代码不会造成内核臃肿吗?

为什么内核中驱动占比最高 一、前言二、Linux中避免内核臃肿的措施2.1 交叉编译及SDK包的裁剪2.2 设备树2.3 模块化2.4 硬件抽象层 三、嵌入式Linux的裁剪四、总结 一、前言 今天逛知乎看到这么一个问题:为什么Linux内核代码60%都是驱动? 如果每支持新的设备就加入…

【设计模式】Java设计模式——模板方法模式(Template Pattern)

文章目录 1. 介绍1.1 定义1.2 作用 2. 模式结构2.1 UML类图2.2 模式组成 3. 代码实例3.1 背景3.2 应用 4. 优点5. 缺点6. 应用场景 1. 介绍 1.1 定义 模板方法模式(Template Pattern),又叫模板模式,它属于行为型模式模板方法模式定义一个模板结构&…

Apikit 自学日记:版本管理

功能入口:API管理应用 / 选中某个项目 / 项目管理菜单 / 项目版本管理 项目版本管理功能模块提供对项目级别的版本管理,可新增、删除、对比项目级版本。在创建项目版本号的时候会对整个项目的部分模块数据进行快照保存。可用于每次迭代发布打全局版本号…

ESP32设备驱动-TMF8801激光测距传感器驱动

TMF8801激光测距传感器驱动 文章目录 TMF8801激光测距传感器驱动1、TMF8801介绍2、硬件准备3、软件准备4、驱动实现1、TMF8801介绍 TMF8801 是一款真正的直接飞行时间 (ToF) 传感器系统,采用单一模块化封装,通过亚纳秒光脉冲和抗锯齿“秒表”方法测量往返时间,提供高精度深度…

流量分析工具wireshark-学习笔记

(一)wireshark工具 1、wireshark工具简介 Wireshark是一种开源网络分析工具,它可以让你在计算机网络上捕获和查看数据包,并能帮助你深入了解网络的运行和协议的实现。它可以捕获不同类型的流量,包括以太网、Wi-Fi、TC…

【面试题】面试官问:如果有100个请求,你如何使用Promise控制并发?

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 开篇 在现代Web开发中,异步请求已经成为了必不可少的一部分。然而,…

ISP之图像降分辨率

1、图像缩放背景 图像的放大、缩小(简称缩放)是图像处理的一种处理方法。所谓图像缩放是指图像分辨率的改变,它在图像显示、传输、图像分析以及动画制作、电影合成、甚至医学图像处理中都有着相当广泛的应用。比如要在1024 X 768 分辨率的显示器上全屏显示800 X 60…

8.2 电压比较器(2)

五、集成电压比较器 1、集成电压比较器的主要特点和分类 电压比较器可将模拟信号转换成二值信号,即只有高电平和低电平两种状态的离散信号。因此,可用电压比较器作为模拟电路和数字电路的接口电路。集成电压比较器虽然比集成运放的开环增益低&#xff…

强化学习从基础到进阶-案例与实践[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C、与生成对抗网络的联系等详解

【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍:【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧…

Arcmap读取nc文件并导出为tif格式

Arcmap读取nc文件并导出为tif格式 前言操作步骤 前言 在使用某一降水数据的时候,发现直接把nc格式的数据拖进Arcmap,查看属性表的时候是空的,点击图上的信息也只会显示一个值,但这个nc数据应该是有很多个值的(我的数据…

Kubernetes - adm搭建 · 保姆级教程

master(2C/4G,cpu核心数要求大于2) 192.168.179.25 docker、kubeadm、kubelet、kubectl、flannel node01(2C/2G) 192.168.179.26 docker、kubeadm、kubelet、kubectl…