单例模式【Singleton Pattern】

单例模式(Singleton Pattern) 单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。本文介绍了单例模式的两种实现方式:饿汉模式和懒汉模式。饿汉模式在程序启动时就创建实例,线程安全但可能浪费资源;懒汉模式在首次调用时创建实例,C++11后线程安全且更节省资源。文章详细解析了两种模式的代码实现、核心特点及适用场景,并对比了它们的优缺点。单例模式适用于需要全局唯一对象的场景,如配置管理、线程池等。建议根据实际需求选择实现方式,确保代码效率和安全性。 阅读详情

这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝中国的历史上很少出现两个皇帝并存的时期,是有,但不多,那我们就认为皇帝是个单例模式,在这个场景中,有皇帝,有大臣,大臣是天天要上朝参见皇帝的,今天参拜的皇帝应该和昨天、前天的一样(过渡期的不考虑,别找茬哦),大臣磕完头,抬头一看,嗨,还是昨天那个皇帝,单例模式,绝对的单例模式,先看类图:


然后我们看程序实现,先定一个皇帝:

package com.cbf4life.singleton1;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 中国的历史上一般都是一个朝代一个皇帝,有两个皇帝的话,必然要PK出一个皇帝出来
*/
public class Emperor {
private static Emperor emperor = null; //定义一个皇帝放在那里,然后给这个皇帝名字

private Emperor(){
 //世俗和道德约束你,目的就是不让你产生第二个皇帝
 }

public static Emperor getInstance(){ 

 if(emperor == null){ //如果皇帝还没有定义,那就定一个
 emperor = new Emperor();
 }
 return emperor;
 }

//皇帝叫什么名字呀
public static void emperorInfo(){
 System.out.println("我就是皇帝某某某....");
 }
} 
然后定义大臣:

package com.cbf4life.singleton1;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 大臣是天天要面见皇帝,今天见的皇帝和昨天的,前天不一样那就出问题了!
*/
@SuppressWarnings("all")
public class Minister {
/**
 * @param args
 */
public static void main(String[] args) {
 //第一天
 Emperor emperor1=Emperor.getInstance();
 emperor1.emperorInfo(); //第一天见的皇帝叫什么名字呢?

 //第二天
 Emperor emperor2=Emperor.getInstance();
 Emperor.emperorInfo();

 //第三天
 Emperor emperor3=Emperor.getInstance();
 emperor2.emperorInfo();

 //三天见的皇帝都是同一个人,荣幸吧!
 }
} 

看到没,大臣天天见到的都是同一个皇帝,不会产生错乱情况,反正都是一个皇帝,是好是坏就这一个,只要提到皇帝,大家都知道指的是谁,清晰,而又明确。问题是这是通常情况,还有个例的,如同一个时期同一个朝代有两个皇帝,怎么办?单例模式很简单,就是在构造函数中多了加一个构造函数,访问权限是 private 的就可以了,这个模式是简单,但是简单中透着风险,风险?什么风险?在一个 B/S 项目中,每个 HTTP Request 请求到 J2EE的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,怎么办?,好,我们写一个通用的单例程序,然后分析一下:

package com.cbf4life.singleton3;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 通用单例模式--"懒汉式"
*/
@SuppressWarnings("all")
public class SingletonPattern {
private static SingletonPattern singletonPattern= null;
//限制住不能直接产生一个实例
private SingletonPattern(){

 }

public SingletonPattern getInstance(){
 if(this.singletonPattern == null){ //如果还没有实例,则创建一个
 this.singletonPattern = new SingletonPattern();
 }
 return this.singletonPattern;
 }

} 
我们来看红色的那一部分,假如现在有两个线程 A 和线程 B,线程 A 执行到 this.singletonPattern =new SingletonPattern(),正在申请内存分配,可能需要 0.001 微秒,就在这 0.001 微秒之内,线程 B 执行到 if(this.singletonPattern == null),你说这个时候这个判断条件是 true 还是 false?是 true,那然后呢?线程 B 也往下走,于是乎就在内存中就有两个 SingletonPattern 的实例了,看看是不是出问题了?如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这才是最要命的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?有很多种方案,我就说一种,能简单的、彻底解决问题的方案:

package com.cbf4life.singleton3;
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 通用单例模式---"饿汉式"
*/
@SuppressWarnings("all")
public class SingletonPattern {
private static final SingletonPattern singletonPattern= new
SingletonPattern();

//限制住不能直接产生一个实例
private SingletonPattern(){
 }

public synchronized static SingletonPattern getInstance(){
 return singletonPattern;
 }
} 
直接 new 一个对象传递给类的成员变量 singletonpattern,你要的时候 getInstance()直接返回给你,解决问题!

实战指南 | 快速修复Adobe Acrobat 2020安装过程中的常见注册表错误 本文提供了Adobe Acrobat 2020安装过程中遇到“无法打开键”注册表错误的详细修复指南。通过安全编辑注册表,精准定位并删除残留键值,可快速解决此常见安装报错,确保软件顺利安装。同时,文章也介绍了其他安装问题的应对策略与预防措施。 阅读详情

相关推荐

【推荐算法】召回模型总结

【推荐算法】召回模型总结

m0_48086806的博客 6239

单例模式(Singleton Pattern)简介

定义 单例模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点(静态方法)。单例模式属于创建型模式。常见的ServletContext、ServletContextConfig、ApplicationContext以及数据库的连接池等都是以单例形式存在的。 常见的单例模式 饿汉式 饿汉式单例是在类加载的时候就立即初始化,并且创建单例对象。绝对线程安全,在线程还没出现以前就是实例化了,不会存在访问安全问题。 优点:没有加任何的锁、执行效率比较高,在用户

weixin_43183107的博客 554

ENVI中Landsat8大气校正法实现地表温度精准反演

本文详细介绍了在ENVI软件中,利用大气校正法对Landsat8热红外数据进行地表温度反演的完整流程。该方法通过辐射定标、大气参数获取、发射率估算及温度转换四个核心步骤,精准剔除大气干扰,还原地表真实温度,是城市热岛效应监测、农业旱情分析等应用的关键技术。

weixin_29292535的博客 150

单例模式——皇帝XXX

秦王嬴政统一中国,认为自己“德兼三皇、功盖五帝”,创“皇帝”一词作为华夏最高统治者的正式称号。自此“皇帝”这个称号沿袭了两千多年。皇帝每天的任务是接待众多的臣子,而众多臣子每天我面对同一个皇帝。臣子们一提到皇帝,便知道是指谁了。因为皇帝只有一个嘛! 那么我们怎么在程序中把这种现象体现出来呢?没错,单例模式!那来看看具体怎么实现的吧:皇帝类:public class Emperor { pr

QAQ 1581

基于STM32F407的立创球形六足双形态机器人:从Morphex复刻到毕业设计的完整开发指南

本文详细介绍了基于STM32F407主控芯片,从零开始复刻Morphex球形六足双形态机器人的完整开发过程。内容涵盖硬件选型(如总线舵机)、机械结构设计(阿基米德螺旋底盘)、软件控制(逆运动学与步态算法)以及多控制方式集成,为嵌入式系统与机器人开发的毕业设计或爱好者提供了全面的实战指南。

weixin_35414260的博客 321

RTK_ROS_导航(4):接入move_base

现在我们要将之前的数据接入到Move_base中,使得机器人能够根据Map上的终点进行导航,并且实现避障效果如下图。

旋风小短腿 1946

java单例模式生成id_JAVA设计模式之单例模式

单例模式(Singleton Pattern)是一种很常见的设计模式。核心就是保证系统中单例类只有一个实例。在系统中某些涉及配置数据,以及生成唯一序列ID的情况用的很多。参考《设计模式之禅》中的定义:Ensure a class has only one instance,and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例...

weixin_35693911的博客 362

Android 11.0 app添加校验锁(输入密码才能进入app)

11.0定制化开发中客户要求给app添加锁,就是点击app 图标时,会弹出Dialog,需要输入密码才能进入app中,就是应用校验锁, 最开始想到在Launcher3中实现,但是如果更换了默认Launcher 又不行了 所以最终还是得拦截app启动Activity 从这里入手了 Launcher与APP是在两个不同的进程中,他们之间的通信是通过Binder完成的,点击Launcher上的某个APP,这时会调用Launcher的startActivitySafely方法。 public boolean sta

安卓兼职framework和app工程师的博客 1952

单件模式(Singleton Pattern)(一):单件模式介绍

一、意图          单件模式(又称单例模式)确保一个类只有一个实例,并提供一个全局访问点。 二、适用性 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 2.当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 三、结构 四、单件模式的经典实现 使用java实现单例模式

jialinqiang的专栏 1万+

ESP32-IDF开发之旅 基础篇⑨ ESP-IDF的FreeRTOS任务间通信和同步

本文介绍了FreeRTOS任务间通信中的队列机制,重点讲解了队列的创建、发送和接收数据的API使用方法。文章提供了详细的技术说明和示例代码,包括xQueueCreate、xQueueSend、xQueueReceive等核心函数的参数说明和返回值解释。通过一个2生产者+1消费者的实际案例,展示了如何在ESP-IDF环境下使用FreeRTOS队列实现任务间通信。示例中包含了数据发送失败处理和接收数据验证等实用技巧,为开发者提供了可参考的实现模式。

单片机菜鸟哥的博客 427

【学习系列】SAP RAP 18:Unmanaged场景开发示例-基本数据更新

本文介绍了在SAP RAP中unmanaged模式下从0到1的开发步骤。unmanaged模式下需要自行实现数据更新、权限检查等逻辑,适用于操作现有数据库表或复杂业务场景。文章以两层的采购订单对象为例,详细说明了创建技术对象(表、视图、行为定义等)的过程,并重点阐述了如何实现CRUD相关方法的核心逻辑。通过创建缓冲类来处理交互阶段和保存阶段的数据操作,确保事务一致性。完整代码展示了抬头层级的增删改查功能实现,为后续明细层级的开发奠定了基础。

DeveloperMrMeng的博客 637

singleton pattern

初识单例设计模式这篇文章是我拜读完许多博客之后所记录的笔记,意义在于自己总结,想了解更多可以点击这里什么是设计模式​ 根据百度百科通俗易懂的解释,设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同

YIII_TIAN的博客 400

AXI总线详解完结篇

经过几个月的整理和发文,AXI总线详解系列正式迎来最终篇,内容基本涵盖了上一篇文章的全部内容。 所有文章的链接如下: 1、 AXI总线详解 2、AXI总线详解-总线和接口以及协议 3、AXI协议中的通道结构 4、AXI总线详解-AXI4读写操作时序及AXI4猝发地址及选择 5、AXI4交换机制 6、ZYNQ中DMA与AXI4总线-DMA简介 7、AXI总线详解-不同类型的DMA 8、AXI总线详解-DMA内部寄存器的读写方式 9、AXI总线详解-几种应用DMA的场合 10、Altera Scatter-G.

OpenFPGA的博客 5489

Singleton Pattern 单例模式

单例的对象只能有一个实例存在

喝醉酒的小白 5011

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

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

【设计模式】——单例模式(Singleton Pattern)

单例模式(Singleton Pattern)是这些设计模式中的一种,它提供了一种创建对象的最佳方式,确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在需要严格控制资源访问、管理全局状态或实现共享资源访问时非常有用。

J^T的博客 4738

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

singleton pattern 单例模式

摘要 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要介绍的——单例模式(Singleton Pattern)。 概念 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。 单例模式,也叫单子模式,是一种常用的软件设计模式...

TIANTIAN_ZZ的博客 224

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

设计模式 - Singleton pattern 单例模式

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

WLKQNYJY_SHT的博客 4112

单例模式 singleton pattern

1定义: 固定某个类只能有一个实例,类不可在外部被new出来,而是调用类的方法来获得实例 2.场景: 需要确保某类在任何时刻都只能有一个实例,在任何时刻保持全局唯一变量的情况下使用 3.实现: 难点是如何在多线程的情况下保证单例模式线程安全性,注意效率、空间占用、线程安全性这3点。先要理解多线程为啥会出现多个实例,我的理解就是类内部在 if instance==null 这步到 ins...

用自己的话说出来才算理解,用自己的方法做到才算会用 225

单例模式——Singleton Pattern

单例模式的核心作用就是保证一个类只有一个实例,并提供一个访问该实例的全局访问点【即提供一个public方法获取该实例】。 应用场景: Windows中的任务管理器项目开发中,读取配置文件的类通常也是单例模式。网站的计数器通常使用单例模式,否则不容易实现同步数据库的连接池的设计一般采用单例模式。在Spring中,每个Bean默认就是单例的,Spring MVC中,控制器对象也是单例的。Ser

不会停下学习的脚步,重在思考。 480

Singleton Pattern单例模式总结

在我们平时工作 或者 面试的时候,单例模式算是出现最频繁的一种设计模式了,本文整理了单例模式的各种实现 1、饿汉模式【简而言之,就是不管你用不用,我先创建出来】 public class HungrySingleton { private static final HungrySingleton hungry = new HungrySingleton(); privat...

qq_37254296的博客 212

设计模式-01单例模式Singleton Pattern

单例模式是一种创建型设计模式,确保类只有一个实例并提供全局访问点。常见实现方式包括:饿汉式(线程安全但提前创建)、懒汉式(延迟加载需同步)、双重检查锁定(高性能线程安全)、静态内部类(线程安全延迟加载)和枚举单例(最佳实践,防止反序列化攻击)。该模式广泛应用于框架如Spring的ApplicationContext和Netty的EventLoopGroup等场景,适用于需要全局唯一实例的情况。

d3y1`5 81_09 1465

单例模式(Singleton Pattern)

文章目录模式动机模式定义模式结构模式分析模式实例模式优点模式缺点适用场景模式应用总结 单例模式 保证一个类仅有一个实例,并提供一个访问他的全局访问点 通常我们可以让一个全局变量使得一个对象被访问,但他不能防止你实例化多个对象,一个最好的方法就是,让类自身负责保存他的唯一实例,这个类可以保证没有其他实例可以被外部创建,并且他可以提供一个访问该实例的方法 单例模式因为Singleton类封装他的唯一实例,这样他可以严格的控制客户端怎样访问他以及何时访问他简单地说就是对唯一实例的受控访问 单例模式的两个基本的问

Sharker_Blog的博客 530
上一篇: 代理模式【Proxy Pattern】
下一篇: 多例模式【Multition Pattern】
涛濤
博客等级 码龄12年 136粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值