单例模式

Unity框架学习【单例模式基类】{个人单例模式总结,框架单例模式总结} 这三天花了点时间,学习了B站唐老师的框架,里面有很多知识都有很强的复用性。 即,完成一次之后的很多工作都可以节省,而且优化整个程序的结构。 首先就是唐老师的课程都是递进式的,也就是前面的课程会很大程度的影响到后面的课程,而单例模式,是我目前使用最多的模式【要加紧学习新的设计模式】,例如在我的一本介绍《游戏设计模式》课本里面就有明确的写到。 “唯独单例模式,我们是要考虑怎么尽可能少的去使用他” 然后... 阅读详情
1、饿汉式
public class Hungry {
	// 私有化构造方法
	private Hungry () {}
	// 初始化对象
	private static Hungry hungry = new Hungry();
	// 公开的获取对象的方法
	public static Hungry getInstance() {
		return hungry;
	}
}
2、懒汉式
2.1 单线程版本

多线程不安全原因?
多线程情况下,多个线程同时执行到 if(lazyMan ==null)语句,创建多个引用对象。

public class LazyMan {
	private LazyMan() {};
	private static LazyMan lazyMan;
	// 公开获取对象的方法
	public static LazyMan getInstance() {
		if (lazyMan == null) {
			lazyMan = new LazyMan();
		}
		return lazyMan;
	}
}
2.2 多线程版本

第一种:

public class LazyMan {
	private LazyMan() {
		System.out.println(Thread.currentThread().getName());
	};
	private static LazyMan lazyMan;
	// 公开获取对象的方法  直接加Synchronized影响性能
	public synchronized static LazyMan getInstance() {
		if (lazyMan == null) {
			lazyMan = new LazyMan();
		}
		return lazyMan;
	}
}

第二种:DCL

public class LazyMan {
	private LazyMan() {
		System.out.println(Thread.currentThread().getName());
	};
	private volatile static LazyMan lazyMan; // volatile 避免指令重排
	// 公开获取对象的方法
	public static LazyMan getInstance() {
		if (lazyMan == null) { // 第一次校验,只有第一次线程不安全
			synchronized (LazyMan.class) {
				if (lazyMan == null) {  // 第二次校验
					lazyMan = new LazyMan();// 不是原子性操作
					/**
					 * 1、分配内存空间
					 * 2、执行构造方法,初始化对象
					 * 3、对象指向空间  1/3/2
					 * 
					 * @Explain 指令重排导致命令执行顺序是 1、3、2
					  * 当A线程执行指令3时,对象部分初始化,线程B进行第一次判断lazyMan != null,直接return:解决方式,使用volatile避免指令重排
					 * */
				}
			}
		}
		return lazyMan;
	}
	public static void main(String[] args) {
		for (int i = 0; i < 100000; i++) {
			new Thread(()->{
				LazyMan.getInstance();
			}).start();
		}
	}
}
3、静态内部类??
public class Inner {
	private Inner () {};
	public static class InnerClass {
		private static final Inner INNER = new Inner();
	}
	public static Inner getInner() {
		return InnerClass.INNER;
	}
}

以上三种可以被反射破坏:通过反射调用私有构造器创建对象

4、枚举 枚举单例不能被反射破坏

enum修饰的类编译之后其实是一个final类型,所以无法被继承
enum修饰的类,其实是Enum的子类
INSTANCE是静态且不可变的EnumSingle对象

public enum  EnumSingle {
    INSTANCE;
    public void doing(){
        System.out.println();
    }
    
    public static void main(String[] args) {
    	EnumSingle.INSTANCE.doing();
		for (int i = 0; i < 10; i++) {
			new Thread(()->{
				System.out.println(EnumSingle.INSTANCE);
			}).start();
		}
	}
}

尝试使用反射破坏枚举单例

// 枚举本身是一个类
public enum EnumSingle {
	INSTANCE;
	public void doing() {
		System.out.println();
	}
	public static void main(String[] args) throws Exception {
		EnumSingle instance1 = EnumSingle.INSTANCE;
		System.out.println(instance1);
		Constructor<EnumSingle> constructor = EnumSingle.class.getDeclaredConstructor();
		constructor.setAccessible(true);
		EnumSingle newInstance = constructor.newInstance();
		System.out.println(newInstance);
	}
}

异常:没有无参构造
在这里插入图片描述
正常防止反射创建对象抛出的异常
在这里插入图片描述
通过javap -p 反编译class文件,两个参数的构造器
在这里插入图片描述
通过两个参数的构造器创建对象

public enum EnumSingle {
	INSTANCE;
	public void doing() {
		System.out.println();
	}

	public static void main(String[] args) throws Exception {
		EnumSingle instance1 = EnumSingle.INSTANCE;
		System.out.println(instance1);
		Constructor<EnumSingle> constructor = EnumSingle.class.getDeclaredConstructor(String.class,int.class);
		constructor.setAccessible(true);
		EnumSingle newInstance = constructor.newInstance();
		System.out.println(newInstance);
	}
}

抛出异常
在这里插入图片描述

设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例 上面讲了单例模式的三种方式,另外还有一种注册式单例模式。 阅读详情

相关推荐

OpenHarmony实战开发-如何实现文件分布式同步编辑

在分布式文件场景中,分布式设备管理包含了分布式设备搜索、分布式设备列表弹窗、远端设备拉起三部分。首先在分布式组网内搜索设备,然后把设备展示到分布式设备列表弹窗中,最后根据用户的选择拉起远端设备。两台设备组网的分布式场景是工作中常常需要的。这样的分布式场景有助于加快工作效率,减少工作中的冗余,本例将为大家介绍如何实现上述功能。​ (2)订阅分布式数据变化:通过this.distributedObject.on(‘status’, this.statusCallback)监听分布式数据对象的变更。

2401_82546228的博客 753

单例模式的实现

当在应用程序中需要控制资源共享、进行配置管理和日志记录等操作时,一种常见的需求是希望通过一个全局访问点,让程序无论在哪个地方,只要能够访问到,就可以通过这个全局访问点,来获取相关实例信息。对于懒汉式单例模式,单例实例在第一次被使用时构建,延迟初始化,相对资源利用率高。如果学过Spring的小伙伴,应该清楚,Spring框架中,默认情况下管理的Bean是单例的,这也意味着Spring容器在创建和管理Bean时,每个Bean只会有一个实例,并且这个实例会被所有需要它的地方共享。:避免重复创建实例,节省资源。

Hardy Army的博客 1613

LSF实践专题(15):LSF队列优先级以及抢占功能初探

在LSF暂停作业时,会向作业发送一个SIGTSTP信号,并且将作业状态变成SSUSP(system suspend),表示被系统暂停,这时,最好是作业的应用能够捕获和处理SIGTSTP信号,否则,即使在LSF中,作业会被认为暂停了,并且释放了slots资源,但是在实际OS中,作业进程仍然在继续,并且不会释放CPU等计算资源。是指LSF自动将低优先级作业暂停(suspend),将空余出来的资源交给高优先级队列中的作业使用,等到高优先级队列的作业结束后,再将被暂停的作业恢复(resume)并继续运行。

richycn的博客 1919

C++单例模式详解

C++ 单例模式详解,懒汉式单例,饿汉式单例

Marvek的博客 5329

通俗傻瓜式理清光栅化渲染和光线追踪渲染的原理

用通俗语言傻瓜式的讲清楚光栅渲染和光线追踪渲染的原理,方便没有相关理论基础的朋友理解入门。

qq_37366618的博客 2万+

TLSR8258蓝牙Mesh实战:从SDK下载到自定义通信指令全流程(附避坑指南)

本文详细介绍了TLSR8258蓝牙Mesh开发的完整流程,从SDK下载、环境搭建到自定义通信指令的实现。通过实战案例和避坑指南,帮助开发者快速掌握低功耗蓝牙Mesh网络构建技巧,适用于智能家居、工业监控等物联网场景。

weixin_29176179的博客 199

什么是单例模式?单例模式详解

个人印象笔记地址:https://app.yinxiang.com/fx/eaa22560-57a4-4554-8de8-b5f254090d37 单例模式介绍 1.1 模式说明 实现1个类只有1个实例化对象 & 提供一个全局访问点 1.2 作用(解决的问题) 保证1个类只有1个对象,降低对象之间的耦合度 1.3 工作原理 在Java中,我们通过使用对象(类实例化后)来操作这些类,类实例化是通过它的构造方法进行的,要是想实现一个类只有一个实例化对象,就要对类的构造方法做改变。 单

weixin_43373417的博客 2125

ESP32驱动GC9A01圆形屏实战:Arduino平台LVGL移植与图像显示优化

本文详细介绍了在Arduino平台上使用ESP32驱动GC9A01圆形屏的实战指南,包括硬件连接、LVGL移植与图像显示优化。通过SPI配置、LVGL库安装和双缓冲机制等技巧,帮助开发者快速实现高效显示效果,适用于智能家居控制面板等应用场景。

weixin_29182481的博客 736

单例模式笔记

单例模式 简述: 单例模式是一种常用的软件设计模式。这种模式属于创建型模式,在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例,该模式的类提供了一种访问其唯一的对象的方式。 饿汉式单例模式 简述:在类加载之前唯一实例对象已经创建完成 实现类: package com.wu.Singleton; public class SingletonDemo { private String name; private int age ; //

一夜星尘 9383

430单片机实现三人投票表决器_基于单片机的五人表决器的设计

姚海云+马野摘要:本设计利用51单片机,按键开关模块,数码管显示模块和LED模块来实现一个简单的五人表决器的功能。按键开关模块中的键2~键6表示五个人,由5个人来投票,当同意的票数大于或者等于3人时,数码管显示同意的人数,说明表决通过。当表决的人数小于3时,数码管显示同意的人数。关键词:表决器;单片机;流水灯;数码管;矩阵键盘;时钟中图分类号:TP391 文献标识码:A 文章编号:1009-304...

weixin_33277215的博客 2558

华为OD机试真题 新系统2026-04-01 C++ 实现【计算数列位置N的值】

如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;1、输入M、N两个数,则按照以下规则形成一个数列;两个整数,用逗号分割,分别表示M和N。一个整数,表示数列第N个位置上的数值。2、数列的前M个元素的值为1到M;请计算该数列第N个位置上的数值。N取值范围:1<= N<=50。M取值范围:3<=M<=10。

MISAYAONE的博客 1156

单例模式《单例模式概念、什么时候能用到单例模式、单例模式的好处》

坚持原创输出,点击蓝字关注我吧作者:清菡博客:oschina、云+社区、知乎等各大平台都有。目录一、单例模式的概念1.类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎...

清菡的博客 1480

JavaScript - Blob / File / base64 使用场景介绍与相互转换

前言 本文首先介绍一下这三种对象使用场景,最后介绍下它们之间互转格式的解决方案。 您前端一旦涉及到文件或图片上传到服务器, 就势必离不了Blob/File/base64三种主流的类型。 Blob MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/Blob 您可以观察到,像一些图片处理插件(例如有名的vue-cropper)图片裁剪插件, 它们将图片处理完毕后,都将使用blob对象返回处理好的图片,供开发者用于上传服务器。

🏆 前端领域优质创作者 4495

单例模式以及反射对单例模式的破坏及防御

单例模式是 Java 中非常重要的设计模式,它确保了类只有一个实例,但由于 Java 的反射机制,饿汉式、懒汉式、双重校验锁和静态内部类实现的单例模式都可以被反射轻松破坏。通过在构造方法中添加实例校验机制,我们可以有效防止反射创建多个实例。饿汉式:即使不使用,也会提前加载单例,浪费内存。懒汉式:通过实现线程安全的懒加载,但并发性能较低。双重校验锁:提高了并发性能,使用volatile防止指令重排问题。静态内部类:相较于双重校验锁更加优雅,实现了懒加载和线程安全。

weixin_54574094的博客 1904

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

小谈单例模式 | 单例模式的八种写法?

看了这篇文章,你能和面试官畅谈单例模式一、前言二、单例模式最通俗的解释来一个简单的例子三、实现单例模式的8种写法1.饿汉式(静态常量)(可用)2.饿汉式(静态代码块)(可用)3.懒汉式(线程不安全)(不可用)4.懒汉式(线程安全)(不推荐)5.懒汉式(线程不安全)(不可用)6.懒汉式(双重检查)(推荐面试使用)7.懒汉(静态内部类方式)(可用)8.枚举 推荐在项目中使用四、常见面试问题五、关于几种...

qq_35764460的博客 1690

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java单例模式、Scala单例模式

单例java的两种单例模式Scala的单例模式 java的两种单例模式 /** * 单例 * * 一个类只能创建一个对象, * 定义的步骤: * 恶汉式: * 1、私有构造器 * 2、提供一个public的static的返回值为本类引用的方法 * 3、为了给第2步中提供实例,创建一个private的s...

Baiyabai的博客 1236

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

单例模式及破解单例模式

单例模式:一个类自己负责创建自己的对象,同时确保系统中该对象只会被创建一个! 特点: 在整个系统中只能有一个该类的实例(必须确保构造器私有,避免其他类new出该类的对象) 他必须自行创建这个实例(在代码对应的类中自己编写实例化逻辑) 它必须自行向整个系统提供这个实例(对外提供实例化方法,外面的类想要这个实例的对象随时可以调用) 单例模式的饿汉式 public class Person { private String name; private String age; //

weixin_49149614的博客 679

什么是单例模式

单例模式: 1.保证类在内存中只能有一个对象 单例模式分为: 1.懒汉式:类一加载就创建对象 2.饿汉式:用的时候,才去创建对象 相关经验: 饿汉式 (是不会出现问题的单例模式) 懒汉式 (可能会出现问题的单例模式) (1.)懒加载(延迟加载) (2.)线程安全问题 1.)是否多线程环境 是 2.)是否有共享数据 是 3.)是否有多条语句操作共享数据 是 举例: 1.饿汉模...

Good_Luck_Li的博客 7758

单例模式的应用

单例模式定义: 单例模式(Singlleton Pattern) 是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。 一、饿汉式 优点:执行效率高,性能高,没有任何的锁 缺点:某些情况下,可能会造成内存浪费 二、懒汉式 优点:节省了内存 缺点:线程不安全的问题 三、线程式 四、 ...

qq_43170213的博客 1981

单例模式及单例模式的应用

单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 ...

xpdbaba的博客 577

设计模式 —— 单例模式

单例模式(Singleton Pattern)是一个比较简单的模式,其定义如下:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

weixin_44814196的博客 1006
上一篇: 1052. 爱生气的书店老板
下一篇: TCP三次握手四次挥手简单介绍
恩洛
博客等级 码龄9年 2粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值