设计模式 - 单例模式(二)六种写法

用人话讲明白线性回归LinearRegression 目录 什么是回归 一元线性回归 损失函数 最小二乘估计 小结 1. 什么是回归 当我们学习一门新课程、接触一个新专业时,总会对该领域的专有名词感到困惑,甚至看完解释仍难以理解其含义。在我们一起学习machine learning的过程中,我会尽量对相关名词用“人话”做一遍解释,以减少学习的“痛苦感”。 譬如今天要学的线性“回归”,这个回归(regression)和我们平时说的“回归祖国”的回... 阅读详情

单例模式代码演进

懒汉式

package com.wang.c_singleton;
/**
 * <pre>
 * 单例模式 :  同时在内存中,只有一个对象存在。
 * 如何保证一个类在内存中只能有一个实例呢?
 *    1:构造私有 2:使用私有静态成员变量初始化本身对象 3:对外提供静态公共方法获取本身对象
 * 单例模式有两种实现方式: 1:懒汉式(延迟加载) 2:饿汉式
 * </pre>
 * 饿汉式 Singleton1
 * @author wangSong
 */
public class Singleton1 {
	/**
	 * 2:使用私有静态成员变量初始化本身对象
	 */
	private static Singleton1 instance = new Singleton1();
	/**
	 * 1:构造私有
	 */
	private Singleton1() {
	}
	/**
	 * 3:对外提供静态公共方法获取本身对象
	 * @return
	 */
	public static Singleton1 getInstacne() {
		return instance;
	}
}

恶汉式

 

package com.wang.c_singleton;
/**
 * <pre>
 * 单例实现之懒汉式实现
 * 思想:需要对象的时候,再去创建对象
 * 懒汉式设计模式,另一种叫法:延迟加载
 * 懒汉式单例模式步骤:
 * 	  1:构造私有 
 *    2:定义私有静态成员变量,先不初始化
 *    3:定义公开静态方法,获取本身对象
 *    	有对象就返回已有对象
 *    	没有对象,再去创建
 * 线程安全问题,判断依据:
 * 	  1:是否存在多线程	是  
 *    2:是否有共享数据	是
 *    3:是否存在非原子性操作	
 * 这个类可以满足基本要求,但是,懒汉式单例实现,存在线程安全隐患,如何解决?
 * 我们首先会想到对getInstance方法加synchronized关键字,SingletonFactory3
 * </pre>
 * @author wangSong
 */
public class Singleton2 {
	/**
	 * 2:定义私有静态成员变量,先不初始化
	 */
	private static Singleton2 instance = null;
	/**
	 * 1:构造私有
	 */
	private Singleton2() {
	}
	/**
	 * 3:定义公开静态方法,获取本身对象
	 * @return
	 */
	public static Singleton2 getInstance() {
		if (instance == null) {
			instance = new Singleton2();
		}
		return instance;
	}
}
package com.wang.c_singleton;
/**
 * <pre>
 * 		对getInstance方法加synchronized关键字
 *      synchronized关键字锁住的是这个对象,这样的用法,在性能上会有所下降
 *      因为每次调用getInstance(),都要对对象上锁
 *      事实上,只有在第一次创建对象的时候需要加锁,之后就不需要了
 *      所以,这个地方需要改进 Singleton4
 * </pre>
 * @author wangSong
 */
public class Singleton3 {
	private static Singleton3 instance = null;
	private Singleton3() {}
	/**
	 * <pre>
	 * 此处考验对synchronized知识点的掌握情况
	 * 线程安全,因为线程锁是在方法级别,导致执行效率低下,浪费资源
	 * </pre>
	 * @return
	 */
	public static synchronized Singleton3 getInstance() {
		if (instance == null) {
			instance = new Singleton3();
		}
		return instance;
	}
}
package com.wang.c_singleton;
/**
 * <pre>
 * 双重检查加锁
 * 似乎解决了之前提到的问题,将synchronized关键字加在了内部,也就是说当调用的时候是不需要加锁的,只有在instance为null,并创建对象的时候才需要加锁,性能有一定的提升。
 * 
 * 但是,这样的情况,还是有可能有问题的,看下面的情况:
 *    在Java指令中创建对象和赋值操作是分开进行的,也就是说instance = new Singleton();语句是分两步执行的。
 *    JVM并不保证这两个操作的先后顺序,也就是说有可能JVM会为新的Singleton实例分配空间,然后直接赋值给instance成员,然后再去初始化这个Singleton实例。
 * 这样就可能出错了,(理论错误,实际可能很难复现该场景)我们以A、B两个线程为例:
 *    a) A、B线程同时进入了第一个if判断
 *    b) A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton();
 *    c) 由于JVM内部的优化机制(指令重排序),JVM先划分出一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。
 *    d) B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。
 *    e) 此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。
 * 所以程序还是有可能发生错误,其实程序在运行过程是很复杂的,从这点我们就可以看出,尤其是在写多线程环境下的程序更有难度,有挑战性。
 * </pre>
 * 我们对该程序做进一步优化:Singleton6
 * @author wangSong 
 */
public class Singleton4 {
	private static Singleton4 instance = null;
	private Singleton4() {}
	/**
	 * 双重检查加锁
	 * @return
	 */
	public static Singleton4 getInstance() {
		if (instance == null) {
			synchronized (Singleton4.class) {
				if (instance == null) {
					instance = new Singleton4();
				}
			}
		}
		return instance;
	}
}
package com.wang.c_singleton;
/**
 * 使用内部类来创建单例
 * @author wangSong
 */
public class Singleton5 {
	private Singleton5() {
	}
	/**
	 * 此处使用一个内部类来维护单例 JVM在类加载的时候,是互斥的,所以可以由此保证线程安全问题
	 * @author wangSong
	 */
	private static class Singleton5Factory {
		private static Singleton5 instance = new Singleton5();
	}
	/**
	 * 获取实例
	 * @return
	 */
	public static Singleton5 getInstance() {
		return Singleton5Factory.instance;
	}
}
package com.wang.c_singleton;
/**
 * 双重检查加锁 + volatile
 * volatile关键字的第一个作用:就是禁止被它修饰的变量相关操作进行指令重排序,保证有序性
 * volatile关键字的第二个作用:就是禁止工作内存使用,直接操作主内存,保证可见性
 * @author wangSong
 */
public class Singleton6 {
	private volatile static Singleton6 instance = null;
	private Singleton6() {}
	/**
	 * @return
	 */
	public static Singleton6 getInstance() {
		if (instance == null) {
			synchronized (Singleton6.class) {
				if (instance == null) {
					instance = new Singleton6();
				}
			}
		}
		return instance;
	}
}

 

Vue3 - 解决报错 Uncaught (in promise) DOMException: Failed to execute ‘insertBefore‘ on ‘Node‘: The node vue3,报错,vue3报错,Uncaught(inpromise)DOMException:Failedtoexecute'insertBefore'on'Node':Thenodebeforewhichthenewnodeistobeinsertedisnotachildofthisnode,如何解决这个错误,动态渲染,v-if,v-show,insertBefore,详细解决方法,vue3未能在“Node”上执行“insertBefore”:要插入 阅读详情

相关推荐

STM32驱动数码管:从硬件连接到动态显示实现

本文详细介绍了使用STM32单片机驱动数码管的完整流程,从硬件连接到软件实现。内容涵盖共阳/共阴数码管原理、GPIO配置、段码表生成,并重点解析了多位数码管动态显示的核心技术,包括动态扫描原理、消影处理及实战代码,帮助开发者快速掌握这一嵌入式开发基础技能。

p5l2m9n4o6q的博客 575

详解单例模式六种写法的优缺点

前言 单例模式:保证一个类有且仅有一个实例. 通过定义我们可知它是创建型的一种, 也是比较简单的一种 单例模式的使用场景: 频繁的进行创建和销毁的对象、创建对象时消耗过多或者消费资源过多,但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象. 下面主要分析一下单例模式的六种写法, 以及优缺点! 饿汉式(静态常量) 懒汉式(线程不安全) 懒汉式(线程安全) 双重检查 静态内部类 枚举 饿汉...

志不强者智不达,言不信者行不果 7294

Lama:基于傅立叶卷积的分辨率鲁棒性大掩模修复

为了缓解修复网络和损失函数都缺乏有效的感受野这个问题,提出了大掩模修复(LaMa)。LaMa基于一种新的修复网络架构,该架构使用快速傅立叶卷积(FFC),具有图像范围的感受野;高感受野感知损失;大型训练掩码,释放前两个组件的潜力。

qq_44926214的博客 1417

单例模式的六种写法

单例模式的六种写法 重新回顾一下设计模式中的单例模式。 单例模式就是保证一个类只有一个实例,并提供一个访问它的全局访问点。使用场景: 整个项目需要一个共享访问点或共享数据。 创建一个对象需要耗费的资源过多,比如访问I/O或者数据库等资源。 工具类对象。 单例模式有很多种写法,最常见有六种写法。 1.饿汉式 public class Singleton { //饿汉式 private Singleton(){} private static Singleton instance =

feng海涛 1765

移远EC800M CAT1模块HTTP POST实战:从AT指令到数据上报的完整避坑指南

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报的完整开发流程,包括模块初始化、PDP上下文配置、HTTP POST实现及优化策略。针对实际开发中的常见问题如网络异常、低功耗需求等提供了经过验证的解决方案,帮助开发者快速实现稳定可靠的物联网数据传输功能。

weixin_42556197的博客 479

天地图下载带审图号(审图号: GS(2024)0650号)的 “行政区划” 数据(含shp文件下载地址)

在科研投稿论文过程中,多数期刊杂志要求我们制作涉及国界的图件,必须使用自然资源部地图技术审查中心发布的标准地图底图。如地理学报、地理科学等期刊的投稿指南中写到:非标准底图本刊不予发表!(如图1.1所示)如果一定要用,凡涉国界图件(国内部分地区、全国、世界部分地区、全球)必须使用自然资源部标准地图服务系统标准地图底图(http://bzdt.ch.mnr.gov.cn/)(如图1.1所示)或国家测绘局地理信息局标准地图底图(如图1.2所示),所用底图边界要完全无修改(包括南海诸岛位置)。

JData_Engineer的博客 2302

Java设计模式:单例模式之六种实现方式详解(二)

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目标是确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在单例模式中,类的构造函数通常是私有的,以防止其他类实例化它。同时,该类提供一个静态方法或属性来获取该类的唯一实例。单例模式的应用场景包括需要频繁进行创建和销毁的对象、需要共享资源的情况以及需要全局唯一访问点的场景等。通过使用单例模式,可以节省系统资源、提高性能并避免对共享资源的多重占用。

码到三十五 5975

[Unity开发] [PICO]避坑指南:PICO商店上传APP时PXR Platform APPID设定详解

PICO开发者上传Unity应用时常见的"APPID不符"问题,主要源于混淆了开发者后台两个不同位置的APPID。

每日出拳老爷子的博客 555

每天一个设计模式之单例模式(六种写法)

每天学会一个设计模式,让你的代码优雅起来。本篇介绍单例模式6种写法,从简单到复杂,从缺陷到完善,尽量cover所有面试点。

Dive Deep into The Knowledge 450

042_小驰私房菜_MTK Camera yuv旋转90度方案

做旋转可以在app层接收到数据后,自行做旋转,也可以在hal层,针对yuv format这路流进行旋转。那我们做旋转也可以采用类似的方式。预览和录像是正常的,这个是因为预览和录像有方向相关属性可以调整,系统会根据摄像头mount的角度已经当前设备的方向,进行对应的旋转。这个下面这个文件,可以修改摄像头的mount角度。,可以看到前摄的Orientation是270,所以原始出图是做了90度的旋转。这个方案,思路就是在配流信息中,将rotation信息进行修改。注:本文章所用权归:小驰成长圈,禁止转载宣传!

587

10、进化动力学谱分析中的开放性问题

本文探讨了进化动力学谱分析中的若干开放性问题,重点围绕进化算法的性能与设计理论展开。文章首先介绍了规范模型及其线性动力学特性,随后深入分析了在实际应用中偏离理想情况的两个关键因素:有限种群和双亲重组。在此基础上提出了三个核心开放性问题:寻找最优传输矩阵以实现全局最优解的高效搜索、无限与有限种群模型谱之间的关系、以及卡林定理在多遗传算子下的推广可能性。通过谱条件、快速混合性与首次命中时间的关系分析,文章进一步讨论了全局吸引与快速收敛的理论基础,并提出了未来的研究方向,包括理论深化、实验拓展与跨学科融合,旨在为

cuda7parallel的博客 80

设计模式之单例模式的六种写法

单例模式,指的是采取一定的方法,保证在整个软件系统中,对某个类来说,它只存在一个实例对象。 说起单例模式,我们一般都能说出饿汉式和懒汉式。本文提供具体的六个单例模式的实现方式,并讨论它们的优缺点。 一、饿汉式 这里是引用 首先,最简单的实现方式就是饿汉式。 在类中定义私有静态属性,并且进行初始化 构造器私有化 提供一个静态公共方法,在需要时能获得该实例对象。 根据初始化的位置不同,又可以分为两...

fxyi的博客 159

AI Agent开发第49课-DIFY让AI自动预约排班后发企业微信通知-MongoDb-Redis-企业微信调用

我们的Dify会讲得很透彻,坚持喂饭级教程,从一个基本的AI自动预约客户到自动记录客户的信息再到自动判断下一步如何走全部是AI化的,这是一个真正的AI原生应用,它来自于我的一个大型物业公司用AI自动预约系统中的一部分。我们会使用这个预约流做完整的Dify例子来讲完,因为它太有代表性了。工作流中的控制反转、AI决策下一步怎么走、人为干涉、用户行为判断、外部中间件如Redis,今天我们就要讲到在Dify中调用MongoDB的数据以及企业微信通知来作为预约派单的最后一步了。

打造全国最全的AI Agent开发知识领域的博客 1753

java设计模式之单例模式详解(六种)

java单例模式(六种) 概述 单例模式是23种设计模式中最常用的一种,属于设计模式中的创建型模式。 单例模式主要作用是让类在应用生命周期中只存在一个实例,避免类的重复创建,降低创建实例的资源消耗,提高性能 单例模式主要应用场景如数据库连接池、线程池、应用配置、spring bean,对了,还有你哦???? 饿汉式   顾名思义,饿汉式就跟你饿了一样,肯定想的是立马吃饭。而在代码里所表达的是立即创建...

qq_38306425的博客 617

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

设计模式 - Singleton pattern 单例模式

单例模式是一种创建型设计模式,它用来保证一个类只有一个实例, 并且提供一个访问该实例的全局节点。其在很多场景中都有应用,比如数据库连接池、日志记录器、Spring中对象的创建等。总的来说,单例模式在需要控制实例数量、确保全局唯一性的场景中被广泛应用。单例模式通过限制类的实例化对象为一个,可以确保全局唯一性的场景中被广泛应用,从而有助于控制资源访问、简化全局访问点、减少内存占用等,在很多情况下都可以提升程序的运行效率。

WLKQNYJY_SHT的博客 4112

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java设计模式系列--单例模式(6种写法)

本文用示例介绍Java的单例模式的写法。有如下六种写法:懒汉式,饿汉式,静态内部类,双重校验锁,枚举,非synchronized的加锁。

IT利刃出鞘的博客 4885

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java设计模式——单例模式的七种写法

单例模式(Singleton) 单例模式(Singleton)是一种常用的设计模式。在Java应用中,单例模式能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全...

u011047968的专栏 365

设计模式--六种创建型模式

前言   每几种模式之间都有一定的联系,从中发现它们的相同点和不同点,研究发生改变的节点,这就是本篇博客所要说明的创建型设计模式之间的联系。它们包括:简单工厂模式、单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。 创建型模式的基本理解 创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。 一个类创建型模式使用继承改变被实例

冯浩月 9638

2.单例模式:设计模式有哪23种???什么是单例模式???单例模式有哪六种实现方式???

跟汤老师学Java笔记:单例模式 完成:第一遍 1.设计模式有哪23种? 分为三大类: 创建型模式(5):工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式, 组合模式,享元模式。 行为型模式(11种):策略模式、模板模式、观察者模式、迭代子模式、责任链模式、命令模式 、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 2.什么是单例模式? Singleton 单例模式 确保某一个类只有一个实例,而且自行实例化并向整个

ADbyCool的博客 454

常见的六种设计模式以及应用场景

设计模式是对设计原则的具体化。用江湖话说就是武林秘籍,总结出来的一些固定套路,可以帮助有根基的程序员迅速打通任督二脉,从此做什么都特别快。常用的模式及其场景如下。 1) 单例模式。 单例模式是一种常用的软件设计模式。 在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

wymrdjm的博客 2万+

设计模式之单例模式,六种实现,以及反射破解

在介绍设计模式之前,先贴一下设计模式的三种类型,和六大原则。 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 设计模式的六原则 开闭原则:对扩展开放,对修改关闭 里氏代换原则:任何基类可以出现的地方,子类一定可以出现,(子类

Wu_Shang001的博客 285

JS 常用的六种设计模式介绍

常用设计模式 前言 我们经常听到一句话,“写代码要有良好的封装,要高内聚,低耦合”。究竟怎样的代码才算得上是良好的代码。 什么是高内聚,低耦合? 即五大基本原则(SOLID)的简写 高层模块不依赖底层模块,即为依赖反转原则。 内部修改关闭,外部扩展开放,即为开放封闭原则。 聚合单一功能,即为单一功能原则。 低知识要求,对外接口简单,即为迪米特法则。 耦合多个接口,不如独立拆分,即为接口隔离原则。 合成复用,子类继承可替换父类,即为里式替换原则 我们为什么要封装代码? 其实封

一只蒻蒻的博客 7691
上一篇: 设计模式 - 单例模式(一)理论
下一篇: Spring Boot(六)自定义事件及监听
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望星空@脚踏实地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值