单例模式⭐️通过具体代码实现单例模式的不同实现以及周末总结

news2024/12/25 1:54:59

小伙伴们大家好,又是一个平平淡淡的周末,先来回顾下这周的情况吧

  • 主线开发任务正常,没有滞后
  • 首次通过定时任务来处理脚本,测试通过
  • 熟悉定时任务的远程,本地来回切换

 2023.12.16         天气阴       气温零下

  •   一觉睡到等等 8点?再睡儿会 一觉到九点半,舒服了
  •  刷会儿视频为起床蓄能,老三样,喂,肝,俯
  • 看会儿设计模式。。。困死 肝会儿游戏
  • 累了,歇会儿睡到两点半,起来敲敲代码
  • WeChat 找朋友唠会儿磕
  • 晚上就追追剧得了

 

目录

一、简介  

二、代码实例

2.1 单例模式之懒汉式

2.2 单例模式之饿汉式

2.3 单例模式之双重检查

2.4 单例模式之静态内部类

三、总结


来分析下今天看的设计模式常用的单例模式

一、简介  

        单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。

        在单例模式中,通常会有一个静态方法或静态变量来提供对唯一实例的访问。当第一次调用获取实例的方法时,会创建一个新的实例,并将其保存在静态变量中。之后的每次调用都会返回这个已经创建好的实例。

二、代码实例

2.1 单例模式之懒汉式

        所谓懒汉式是指用的时候再创建对象,这里的getInstance方法用了synchronized方法修饰,是为了避免多线程情况下,误生成了多个对象

public class LazySignle {

    private static LazySignle lazySignle;

    //私有构造方法,避免外部调用
    private LazySignle(){

    }

    public synchronized static LazySignle getInstance(){

        if(lazySignle == null) {
            lazySignle = new LazySignle();
        }
        return lazySignle;
    }
}

        创建一个线程类,用来测试下

public class threadTest implements Runnable {

    @Override
    public void run() {
        LazySignle instance = LazySignle.getInstance();
        System.out.println(Thread.currentThread().getName()+"   "+instance.toString());
    }
}

        启动两个线程,来看下执行结果 

public class LazyTest {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new threadTest());
        Thread thread2 = new Thread(new threadTest());

        thread1.start();
        thread2.start();

        System.out.println("main方法执行完成");
    }
}

         根据对象id可以看出是同一个对象

2.2 单例模式之饿汉式

        饿汉式简单来说就是一开始就将对象创建好

public class HungrySignle {
    private static HungrySignle hungrySignle = null;

    static {
        hungrySignle = new HungrySignle();
    }

    private HungrySignle(){}

    public static HungrySignle getInstance(){
        return hungrySignle;
    }

}

        线程类,测试类跟懒汉式结构一样,就不放代码了,直接看下测试结果

2.3 单例模式之双重检查

        双重检查字如其意,进行两次对象是否为空校验,测试结果如下

public class DoubleCheckSignle {
    final static Object lock = new Object();

    private static DoubleCheckSignle doubleCheckSignle;

    private DoubleCheckSignle(){}

    public  static DoubleCheckSignle getInstance(){
        if(doubleCheckSignle == null){
            synchronized (lock){
                if(doubleCheckSignle == null){
                    doubleCheckSignle = new DoubleCheckSignle();
                }

            }
        }
        return doubleCheckSignle;

    }
}

2.4 单例模式之静态内部类

        静态内部类是指通过内部静态类调用实现单例,测试结果如下

public class StaticInnerClass {

    private static class InnerClass{
        private static StaticInnerClass staticInnerClass = new StaticInnerClass();
    }

    private StaticInnerClass(){}

    public static StaticInnerClass getInstance(){
        return InnerClass.staticInnerClass;
    }
}

三、总结

饿汉式懒汉式静态内部类双重检查
特点在类加载时就创建实例,因此是线程安全的。在首次调用获取实例的方法时才创建实例,延迟初始化。利用静态内部类的特性,在类加载时不会初始化内部类,只有在第一次调用获取实例的方法时才会初始化。通过两次检查锁的方式实现线程安全的懒汉式单例。
优点实现简单,线程安全。延迟加载,节省资源。延迟加载,线程安全,无需加锁。实现延迟加载,线程安全。
缺点可能会造成资源浪费,如果实例一直没有被使用,会一直占用内存。多线程环境下需要考虑线程安全性,可能需要加锁。实现稍微复杂一些。实现较复杂,需要考虑指令重排序问题。

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

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

相关文章

『App自动化测试之Appium应用篇』| uiautomator + accessibility_id定位方法完全使用攻略

『App自动化测试之Appium应用篇』| uiautomator accessibility_id定位方法完全使用攻略 1 uiautomatorviewer无法连接手机1.1 问题现象1.2 解决方法1.2.1 方法一:使用第三方文件(不建议)1.2.2 方法二:导入uix和png文件 2 accessi…

Threejs漫天多彩粒子天空--粒子系统打造

一、导语 漫天多彩粒子天空特效应该也是Threejs项目中挺常见的一个需求,因为它是基于粒子系统,可以衍生出许多的不一样的方案,比如,星空特效,下雨特效,飘雪特效等等,不仅可以用在项目中增加氛围…

【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换

前言 【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换一、多语言本地化插件 Localization1.1 介绍1.2 效果展示1.3 使用说明 二、 插件导入并配置2.1 安装 Localization2.2 全局配置 三、多语言映射表3.1 创建多语言文本配…

AWS-CDN只能备用域名访问-使用Lambda@Edge(禁止分配的域名访问)

场景:cdn使用备用域名后,希望用户只能从备用域名访问,而不是自动分配的cdn域名,这也将是一个安全漏洞,被扫描到cdn域名访问刷流量等! 【建议部署前查看】参考链接: 1.官方cdn返回示例 2.lambdae…

从菜鸟到专业人士:来自真实 PRD 写作经验的 5 个改变游戏规则的产品管理课程

产品管理是一个复杂且具有挑战性的角色。PRD(即产品需求文档)就像构建产品的蓝图,可将其视为指导开发团队创造令人惊叹的产品的详细路线图。本文除了介绍产品经理如何写好PRD,也将进一步阐述产品经理应该学习哪些技能?…

【C语言】动态内存管理(C语言的难点与精华,数据结构的前置知识,你真的掌握了吗?)

文章目录 引言一、为什么要动态内存分配二、动态内存分配的相关函数2.1 malloc2.2 free2.3 calloc2.4 realloc 三、常见的动态内存的错误3.1 对NULL指针的解引用3.2 对动态内存越界访问3.3 对非动态内存释放3.4 对动态内存部分释放3.5 对动态内存多次释放3.6 未对动态内存释放&…

DevEco Studio自定义代码颜色

这里以ArkTS代码颜色举例 进入设置(快捷键CtrlAltS) 选择Editor > Color Scheme > JavaScript 由于之前用习惯VsCode了,这里以注释颜色举例,变为绿色。 上面说的不是以ArkTS代码颜色举例吗?为什么选择JavaScr…

使用下载代替物理串口输出-STM32 Debug (printf) Viewer

使用下载代替物理串口输出-STM32 Debug 硬件要求配置方法代码要求打印输出结果 硬件要求 STM32的PB9、PB10引脚的串口1通常用作其他功能使用后,无法通过printf()函数打印输出想要调试输出查看变量或调试信息。现已使用另外一种方法实现printf()函数打印输出。 ST…

BugKu-Web-滑稽

题目环境 持续的动态图片 F12审查元素 拿下flag:flag{595d994a34342417bfc3a3c3a23e0a48}

Java: Random

/*** encoding: utf-8* 版权所有 2023 涂聚文有限公司* 许可信息查看:* 描述: //https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/RandomStringUtils.html* //https://commons.apache.org/pro…

jmeter 如何循环使用接口返回的多值?

有同学在用jmeter做接口测试的时候,经常会遇到这样一种情况: 就是一个接口请求返回了多个值,然后下一个接口想循环使用前一个接口的返回值。 这种要怎么做呢? 有一定基础的人,可能第一反应就是先提取前一个接口返回…

测试用例设计方法之判定表详解!!

理论部分 判定表是分析和表达多种输入条件下系统执行不同动作的工具,它可以把复杂的逻辑关系和多种 条件组合的情况表达得既具体又明确。 条件桩(Condition Stub)动作桩(Action Stub)条件项(Condition Entry)动作项(Action Entry&#xff0…

Redis常用内存淘汰策略?

从淘汰范围来说可以分为不淘汰任何数据、只从设置了到期时间的键中淘汰和从所有键中淘汰三类。而从淘汰算法来分,又主要分为 random(随机),LRU(最近最少使用),以及 LFU(最近最不常使…

【AI美图】第03期效果图,AI人工智能全自动绘画,二次元美图欣赏

带来一组二次元人工智能自动绘图 对比分析: 标题手画二次元需要技巧: 二次元高清图片的绘制技巧主要包括以下几点: 线条的运用:在二次元风格的绘画中,线条的运用非常重要。要绘制出流畅、细腻的线条,需…

VBA技术资料MF96:单字段多条件高级筛选

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(六)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型(一) 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

Day10 Liunx高级系统设计11-数据库2

DQL:数据查询语言 查询全表 select * from 表名; 查询指定列 select 列名 1, 列名 2,… from 表名 ; 条件查询 select * from 表名 where 条件 ; 注意: 条件查询就是在查询时给出 WHERE 子句,在 WHERE 子句中可以使用如下运算符及关键 字&#…

学习笔记10——Mysql的DDL语句

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/197161.html 数据库创建: CREATE DATABASE books; CREATE DATABASE IF NOT EXISTS books;更改字符集 ALTER DATABASE books CHARACTER SET gbk;库的删…

三层交换与DHCP

目录 一、三层交换 (一)基本概念 (二)转发原理 (三)ensp项目实验 二、DHCP (一)DHCP工作原理 1.DHCP的特点 2.工作原理 (二)DHCP项目实验 一、三层交…

电商用户运营优化:腾讯文档API无代码集成

腾讯文档API集成:电商平台无代码客服系统 随着数字化时代的到来,电商平台日益求势于高效率和低成本的运营模式。无代码开发正在改变传统业务流程的构建方式,尤其在客户服务领域,这种转变正变得尤为明显。本文将探索腾讯文档API在…