Singleton模式(单例模式)饿汉式和懒汉式

FPGA远程升级必备:STARTUPE2原语控制Flash的避坑指南 本文深入解析了FPGA远程升级中STARTUPE2原语的核心价值与配置策略,详细介绍了其在QSPI Flash接口设计中的应用。通过Vivado工具和原语控制,开发者可以高效实现安全可靠的远程固件升级,提升系统稳定性和升级效率。 阅读详情

单例设计模式

第一部分:

1、设计模式的概念:

每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次有一次地使用该方案而不必做重复劳动;而模式就是解决某一类问题最行之有效的方案;这是一个纯粹偏思想的,在不断的劳动的过程中总结出来的。

2、设计模式的特点:

2.1、将某一类问题解决起来会变的更简单;
2.2、让复杂的问题简单化;

3、单例设计模式:

解决一个类在内存中存在一个对象;换句话说就是在一个类中只能有一个对象,不可能会出现第二个对象;

4、单例设计模式的由来:

现在有两个程序,分别是A程序和B程序,当A程序要操作一个文件的时候,这是就要new一个对象,当B文件也要操作一个文件的时候,同样也要new一个新的对象,但是A和B操作的不是同一个对象,因此这时要保证对象的唯一性;

5、单例设计模式的思想:

5.1、为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象;
5.2、禁止其他的程序建立对象,由自己来建立对象;
5.3、为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象;
5.4、为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式;

6、单例设计模式的步骤:

6.1、将构造函数进行私有化;
6.2、在类中创建一个本类对象;
6.3、提供一个方法可以获取到该对象;

7、代码表现:

<span style="font-size:18px;">class Single
{
	private int num;
	public void setNum(int num)
	{
		this.num = num;
	}
	public int getNum()
	{
		return num;
	}
//	将构造函数进行私有化;
	private Single(){}
//	创建一个本类对象;
	private static Single s = new Single();
//	返回的是一个Single类型的对象;
	public static Single getInstance()//一个类类型的
	{
		return s;
	}

}
class SingleDemo 
{
	public static void main(String[] args) 
	{
//		类名调用静态方法
		Single s1 = Single.getInstance();
		Single s2 = Single.getInstance();
//		Single s1 = new Single();
//		Single s2 = new Single();
		s1.setNum(30);
		System.out.println(s2.getNum());
//		Single ss =Single.getInstance();
	}
}

/*
打印的是30,说明s1 和s2 指向的是同一个对象
*/</span><span style="font-size:24px;font-weight: bold;">
</span>

8、运行的结果:

设置的是s1的值是30,而打印的是s2的值也是30,由此可以s1和s2所指向的是同一个对象;

9、图形展示:

10、单例设计模式应用:

对于事物该怎么描述,还是怎么描述,当需要将该事物的对象保证在内存中唯一性时,就加入单例设计模式思想即可;

举例:

class Student
{
	private int age;//要将属性进行私有化
	public void setAge(int age)
	{
		this.age = age;
	}
	public int getAge()
	{
		return age;
	}
//	要求保证在内存中的唯一性,那么就加上下面的三步
	private Student(){}
	private static Student s = new Student();
	public static Student getInstance()
	{
		return s;
	}
}
class  SingleStudentDemo
{
	public static void main(String[] args) 
	{
//		调用静态方法;
		Student s1 = Student.getInstance();
		Student s2 = Student.getInstance();
		s1.setAge(34);
		System.out.println(s2.getAge());
	}
}

运行后的结果:

第二部分:

1、饿汉式

先初始化对象,开发一般会用饿汉式

2、饿汉式特点

2.1、Single类进内存,对象还没有存在,就已经创建好了对象;
2.1、安全,简单;

3.饿汉式代码体现

<span style="font-size:14px;">//第一种,这个是先初始化对象
//称为:饿汉式
class Single
{
	private Single(){}
	private static Single s = new Single();
	public static Single getInstance()
	{
		return s;
	}

}</span>

4、懒汉式

对象是方法被调用时,才初始化,也就做对象的延时加载;

5、延时加载

特点:Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象;
6、懒汉式的特点
刚开始不建立对象,如果什么时候需要,那么就什么时候建立对象;

7、懒汉式代码体现

//第二种,对象是方法调用时,才初始化,也叫做对象的延时加载,称为懒汉式
class Single 
{
	private Single(){}
	private static Single s =null;
	public static Single getInstance()
	{
		if(s==null)
		{
			synchronized(Single.class)
			{
				if(s==null)
					s = new Single();
			}
		}
		return s;
	}
}
class  SingleDemo
{
	public static void main(String[] args) 
	{
		Single ss = Single.getInstance();
	}
}
 

8、懒汉式的缺陷

8.1、缺陷:

如果遇到多线程时,当A程序读到getInstance的方法的时候,当cpu执行到s==null时,但是这时cpu切换到去处理B程序了,但是这时A程序就处于休息状态,没有执行程序,但是这时B程序同样也进来了,判断了s==null也是满足条件的,现在A程序醒了,然后执行了s = new Single();创建了一个对象,这是B程序也醒了,又创建了一个对象;换句话说就是现在内存中的对象已经不唯一了,懒汉式在多线程访问时会出现安全隐患;

8.2、措施:

在函数上加上一个锁就是Synchronized,这时如果A程序进来之后,但是B程序就不可以进入程序了,A程序创建了对象之后,然后返回了,这时B程序判断s已经不等于null,那么就不再执行程序了。但是在这个锁加载函数上面,每一个线程都要先进行判断一下,效率比较低效;这时如何能够既能可以保证对象的唯一性又能解决低效的问题?用双重判断来解决:判断锁的次数减少了;

9、面试

9.1、问:懒汉式和饿汉式有什么不同?
答:懒汉式的特点在于实例的延时加载。

9.2、问:懒汉式的延迟加载有没有问题?

答:有,如果多线程访问时,会出现安全问题。

9.3、问:出现了安全问题怎么解决?

答:可以加同步来解决,而加同步的方式有两种,同步代码快和同步函数都行,但是稍微有些低效,用双重判断的形式可以解决效率的问题。

9.4、问:加同步的时候使用的锁是哪一个?

答:该类所属的字节码文件对象。

第三部分

我的总结:

1、定义单例的时候建议使用饿汉式,因为饿汉式不会出问题,简单安全;
2、使用单例延时加载的时候,保证对象的唯一性,以及用双重判断来提高效率;
3、饿汉式的特点:对象先进行初始化;懒汉式的特点:对象后进行初始化;
4、懒汉式如何在多线程访问时解决安全隐患。
5、懒汉式的面试题;

【AI编程】Qoder AI 编程工具从部署到深度使用实战详解 Qoder AI 编程工具从部署到深度使用实战详解 阅读详情

相关推荐

基于Simulink的永磁同步电机(PMSM)无位置传感器矢量控制与龙伯格观测器设计​

本文介绍了基于Simulink的永磁同步电机(PMSM)无位置传感器矢量控制方法,重点讲解了龙伯格观测器的设计与实现。主要内容包括:1)系统架构与数学推导,通过静止坐标系状态方程和极点配置构建观测器;2)Simulink建模步骤,从电机模型搭建到观测器核心代码实现;3)仿真结果对比分析,显示龙伯格观测器相比滑模观测器具有更好的平滑性和抗噪能力;4)工程部署建议,包括参数在线辨识、低速补偿策略和代码生成优化。该方法实现了全速域无感运行,稳态转速误差小于1%,为低成本高可靠性电机控制提供了有效解决方案。

amy_mhd的博客 163

设计模式-创建型-单例模式(Singleton)

保证一个类仅有一个实例,并提供一个全局访问点。上下文(ServletContext)想确保任何情况下都绝对只有一个实例。

存在,即合理 238

在MDK5.37版本中添加Complier Version 5( 解决Missing Compiler Version 5 )

本文章仅作为个人学习记录,方法也是从其他博主的博客中得到的,链接如下:二、Keil——Missing Compiler Version 5 和 core_cm3.c 问题解决 - YI颗白菜 - 博客园 (cnblogs.com) 问题描述 更新最新的keil版本(MDK5.37)后,在编译以前版本的工程文件时,发现出现了非常多的报错,在网上搜索之后发现原来时编译器版本不匹配的问题,即MDK5.37中使用的是Version 6版本的编译器,而缺少Version 5,对于以前编写的工

leveling99的博客 1万+

创建模式-单例模式(Singleton Pattern)

目的: 应用场景: 实现方式: 懒汉模式 饿汉模式一 饿汉模式二 Double Check 枚举方式

菩提本无树 明镜亦非台 本来无一物 何处惹尘埃 597

零基础学习大气污染模式(WRF、WRF-chem、smoke、camx等)

零基础学习大气污染模式(WRF、WRF-chem、smoke、camx等)

weixin_56135535的博客 655

基于FPGA的图像预处理系统(图)

 北京机械工业学院 韩娟娟 邓文怡 娄小平 由于获取图像的工具或手段的影响,使获取图像无法完全体现原始图像的全部信息。因此,对图像进行预处理就显得非常重要。预处理的目的是改善图像数据,抑制不需要的变形或者增强某些对于后续处理来说比较重要的图像特征。通常根据预处理目的的不同,把预处理技术归为图像增强技术和图像分割技术两类。图像对比度处理是空间域图像增强的一种方法。由于图像灰度范围狭窄会使

lyzhangxianglove的专栏 1780

Java-单例模式(饿汉模式与懒汉模式)

单例模式 一.饿汉模式 二.懒汉模式(推荐) 1.单线程版本 2.多线程版本 3.多线程版本plus

f7ashion的博客 862

JS自动化生成大疆WPML航线文件实战(附完整代码与云台控制解析)

本文详细介绍了如何利用JavaScript自动化生成大疆WPML航线文件,以解决手动规划航线效率低、易出错的问题。通过解析WPML文件结构,特别是云台控制等核心参数,并封装可复用的JS模板函数,开发者能够快速批量生成复杂航线,如倾斜摄影五向飞行,实现航测与巡检任务的标准化与高效执行。

weixin_29007243的博客 300

设计模式之单例模式详解(饿汉式、懒汉式以及jdk源码使用举例)

一、概述 1、定义         Ensure a class has only one instance,and provide a global point of access to it。(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例)。 2、单例模式的通用类图: 3、单例模式的几种实现 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 双重检查 静态内

qq_42339210的博客 775

threejs开发可视化数字城市效果

theme: condensed-night-purple 灵感图 现在随着城市的发展,越来越多的智慧摄像头,都被互联网公司布到城市的各个角落,举一个例子,一个大楼上上下下都被布置了智能摄像头,用于监控火势,人员进出,工装工牌佩戴等监控,这时候为了美化项目,大公司都会将城市的区域作为对象,进行3d可视化交互,接下来的内容,就是基于以上元素,开发的一款城市数据可视化的demo,包含楼宇特...

weixin_41770018的博客 1582

X3850x6 6241 fireware固件升级

登录联想https://datacentersupport.lenovo.com/cn/zc网站,选择system x,x3850 x6,type选择6241 选择驱动及应用程序,BIOS/UEFI 选择lnvgy_fw_uefi_a9e156a-4.90_anyos_32-64.uxz 文件,点击下载 选择IMM2, 下载lnvgy_fw_imm2_tcoo58b-5.80_anyos_noarch.uxz ps:3837和3839会跳转到ibm网站下载 笔记本直连.

zds00virtue的博客 5457

24种设计模式之单例模式(饿汉式、懒汉式)

24种设计模式之单例模式(饿汉式、懒汉式)

inexaustible的博客 1万+

深入解析车载以太网DoIP诊断:Wireshark实战TCP/UDS报文分析

本文深入解析车载以太网DoIP诊断,重点介绍如何利用Wireshark进行TCP/UDS报文实战分析。文章详细讲解了从以太网帧、IP帧、TCP段到DoIP协议及UDS服务的逐层拆解方法,并提供了使用Wireshark定位通信故障(如乱序、丢包、重传)的实用技巧,帮助工程师高效排查车载诊断网络问题。

c2d3e4f的博客 677

【Java设计模式】之 单例模式(Singleton Pattern)模式 饿汉式单例模式 vs 懒汉式单例模式

什么是设计模式? 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模免去我们自己再思考和摸索,设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,"套路”。 设计模式的分类: ① 创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 ② 结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ③ 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、

weixin_46081857的博客 419

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

设计模式单例模式(singleton pattern)包括 懒汉式(Lazy Initialization)、饿汉式(Eager Initialization)、可以将普通类变成单例类的模版和代码实践

flyfish

二分掌柜的 1665

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

单例模式-Singleton Pattern 确保对象的唯一性——单例模式 (三):饿汉式单例与懒汉式单例的讨论

3.4 饿汉式单例与懒汉式单例的讨论       Sunny公司开发人员使用单例模式实现了负载均衡器的设计,但是在实际使用中出现了一个非常严重的问题,当负载均衡器在启动过程中用户再次启动该负载均衡器时,系统无任何异常,但当客户端提交请求时出现请求分发失败,通过仔细分析发现原来系统中还是存在多个负载均衡器对象,导致分发时目标服务器不一致,从而产生冲突。为什么会这样呢?Sunny公司开发人员百思

sxl_0305 449

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

单例模式singleton以及两种经典实现:饿汉式和懒汉式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。来一张网上搜来的图,方便学习 来源于百度百科 两种经典实现方式:饿汉式和懒汉式 饿汉...

YesPlus的博客 438

设计模式:Singleton pattern(单例模式) 懒汉式 饿汉式 双重校验锁 静态内部类 枚举法

设计模式应用场景 只需要存在一个实例 实现方式 1.饿汉式 类加载到内存后,就实例化一个单例,JVM保证线程安全 public class M1 { private static final M1 INSTANCE = new M1(); private M1(){} public static M1 getInstance(){ return INSTANCE; } public static void main(String[] args

WindNolose的博客 231

java设计模式(二)--单例模式

单例模式(Singleton Pattern)是java设计模式最简单的设计模式之一,这是我在每一个解释单例模式的文章中都看到的一句话, 首先,我想讲一下我对此设计模式的理解: 这种模式让指定类在系统中只有唯一一个他的实例,我感觉这种模式是不想因太多实例而造成实例不一致的现象,...

98

Singleton 单例模式(饿汉式,懒汉式,双重锁式和内部类式),多种实现方式

单例模式原理 通过私有化构造函数,通过静态公共方法/枚举方式返回对象。 注意:确保实例只有一个,尤其是多线程环境。 饿汉式 /** * 饿汉式(早new对象准备好,担心饿死) * @author:eddyjoe * @date:2019/3/7 */ public class HungrySingle { /**为严谨,加final指向的引用不能再做修改*/ private...

eddyjoe的博客 484

单例(Singleton)设计模式,单例模式(饿汉式、懒汉式)

1.设计模式的说明 1.1 理解 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、 以及解决问题的思考方式。 1.2 常用设计模式 — 23种经典的设计模式 GOF 创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模

lkm0522的博客 179

【设计模式_5】Singleton 单例模式-懒汉式-饿汉式-加锁

Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。 2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。 3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 Java程序写法: 1.单例类:构造方法私有、创建静态对象实例 sta

J.R.Leonardo的博客 407

单例模式Singleton(饿汉式和懒汉式)

单例模式在我们开发中经常会用到的,不知道你所喜欢用饿汉模式还是喜欢懒汉模式呢?为什么会出现有两种方式来实现单例模式? 我看这其中必蹊跷,你怎么看? 大家都知道的是:懒汉模式会通过 判 null,然后 new 出一个实例,也就是懒汉模式会延迟加载出实例对象。还有其他的区别吗? 我们来看一下懒汉模式和饿汉模式的实现代码。 /** * 饿汉模式 * @author zhou.ni *...

涛博 294

单例模式-Singleton(饿汉式,懒汉式,双重校验锁,静态内部类)

class Solution { public List<String> letterCombinations(String digits) { //定义一个返回的结果集 List<String> res = new ArrayList<>(); //如果字符串为空,直接返回 if(digits.length() == 0){ return res; } .

Xxx_Lnox的博客 356

Java —— Singleton 单例模式

文章目录Java —— Singleton 单例模式简介注意用处简单例子基础示例懒汉式(线程不安全)懒汉式(线程安全)饿汉式双检索 / 双重校验锁(DCL,即 double-checked locking)登记式/静态内部类枚举涉及角色要点构造函数相关的设计模式应用实例优点使用场景代码 Java —— Singleton 单例模式 创造型模式 想确保任何情况下都绝对只有1个实例 想在程序上表现出...

Genius only means hard-working all one's life. 2471

Java常用设计模式-Singleton单例模式

Java常用设计模式-Singleton单例模式概念为什么会有单例模式单例模式优缺点编写一个单例模式的几种方式 概念 一个类在整个系统当中,只能出现一个全局访问点。 特点: 一个类只能提供一个实例对象 必须自己创建这个唯一的实例对象 必须自己给所有其他对象提供这个实例 为什么会有单例模式 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows

weixin_43988801的博客 256
上一篇: static关键字
下一篇: 函数的两个特性(重写和重载)
fyldragonfyl
博客等级 码龄12年 9粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值