单例模式的实现

在实际开发中,有些情况下未来避免镀铬实例对象,会用到设计模式的单列模式

通常情况实例对象都是通过public的构造函数实现,这边为了避免多个实例对象,所以用私有的构造函数,防止外部访问,如下代码就是如此实现:

GoF的解决方案
     下面让我们看看最流行的解决方案吧,当然也是我们在项目中用到的最广泛的GoF的那本“设计模式圣经”里面所描述的:

   1. public class PrintSpooler {     
   2.       private PrintSpooler(){}      
   3.    private static PrintSpooler instance = new PrintSpooler();      
   4.       public static PrintSpooler getInstance() {       
   5.             return instance;      
   6.       }   
   7. }   

     神奇吗?把构造函数设为private的,这样的话外部就不能实例化PrintSpooler类,只有自己本身能够实例化自己,然后通过静态方法getInstance()返回这个实例从而提供唯一的访问点。如果你试着运行这行代码:
             PrintSpooler p = new PrintSpooler();
     ^_^,编译器是不会放过你的!那么我们如何使用PrintSpooler呢?很简单,我们敲下这行代码就可以了:
             PrintSpooler p = PrintSpooler.getInstance();
    这个解决方案还有另外一种变形,就是用到Lazy-initialize:

   1. public class PrintSpooler {     
   2.       private PrintSpooler(){}      
   3.    private static PrintSpooler instance = null;      
   4.       public static synchronized PrintSpooler getInstance() {       
   5.              if(instance == null)   
   6.              instance = new PrintSpooler();   
   7.              return instance;      
   8.       }   
   9. }   

     这里有两个问题需要解决:为什么需要 Lazy-initialize?它是什么 ?
                                                     那里冒出的 synchronized ?
     首先,因为有时候单体类在实例化时所需的数据只有在运行时通过计算才能获得,所以我们必须延迟实例化,所以也就有了先前的惰性初始化(Lazy-initialize)--第一次调用时进行初始化。
     其次,考虑的线程安全的因素,如果一个线程发现instance==null而去实例化PrintSpooler,且此时PrintSpooler还未实例化完毕。与此同时另一线程也检查instance,结果为instance==null,所以也去实例化PrintSpooler了,现在 PrintSpooler有了两个实例,不再是单体了。为了防止上面的情况发生,可以用synchronized提供的锁机制,所以就冒出了 synchronized!

3.需要注意的问题
     有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB这样的分布式系统中使用也要注意这种情况,因为EJB是跨服务器和JVM的。所以在EJB中,单体模式就失效了!

4.再罗嗦一些......
     在工厂模式中的类装载器(Class Loader)就是一个单体,J2EE设计模式中的ServiceLocator也是一个单体...我们仔细观察会发现我们的项目中在不知不觉用到好多的单体,其实单体模式的实现并没有难点,真正的难点在于在系统中如何识别单体和不滥用单体,这种敏感性只有不断的实践中才能锻炼出来,所以用好 Singleton是非常不容易的事情......

音频链路分析 音频链路分析摘要 本文分析了蓝牙音频设备(BES2700)的音频传输链路,主要包括通话和音乐播放两种场景: 通话链路: 下行:蓝牙接收数据→解码→通过Codec输出到扬声器 上行:麦克风采集→Codec处理→蓝牙编码发送 音乐播放链路: 通过A2DP协议接收高质量音频数据 经过解码、EQ调节等音频处理后输出 系统采用多线程消息机制处理音频任务,通过mailbox传递控制消息,由回调函数处理具体音频数据流。不同应用场景使用不同的蓝牙协议栈(HFP/HSP用于通话,A2DP用于媒体)和编码方式(mSBC/SBC 阅读详情

相关推荐

将AD域服务从windows server 2008 R2 迁移到windows server 2019

添加一台windows 2019 的服务器并加入现有林的域中,并将角色升级为域控制器。然后迁移FSMO角色,使其成为PDC,然后降级旧DC,并提升域和林的功能级别。最后还要说下,Server 2008 R2我们还可以删除角色并退出当前域,这里就不做操作了。2)右键 mingling.com(我的域为mingling.com)--提升域级别功能。勾选 将域控制器添加到现有域,使用域管理员将DC2加入到现有的AD域。1)打开服务器管理器---工具---AD域和信任关系。2)运行域安装服务向导,选择下一步。

lionxam的博客 3661

Delphi 实现单例模式(Singleton Pattern)

原文:http://www.faceker.com/200808/delphi-singleton-pattern.html 单例模式顾名思义就是一个实例,在任何情况下,系统中只能存在某一对象的一个实例。单例模式在应用开发中比较常见,如 Application 或 Logger。 在 Delphi 的以前版本中,实现单例模式比较“另类”,自从 Delphi 后期加入一些新的语法元素后,单例模式

松龄的专栏 1768

均值回归 高频交易_基于布林带的均值回归交易策略

BOLL指标是美国股市分析家约翰·布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。一般而言,股价的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,布林线指标正是在上述条件的基础上,引进了“股价通道”的概念,其认为股价通道的宽窄随着股价波动幅度的大小而变化,而且股价通道又具有变异性,它会随着股价的变化而自动调整。由于之前大部分交易策略都是选股或者趋势追踪的择时,...

weixin_42528534的博客 1458

单例模式(Singleton Pattern)的6种实现

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

u012510849的专栏 378

DeepSeek在实时计算与流处理系统中的突破性实践

对于技术决策者而言,现在正是将DeepSeek实时计算技术纳入企业架构蓝图的关键时机,那些能够率先构建实时智能能力的企业,将在数据驱动的商业竞争中赢得决定性优势。DeepSeek通过创新的流处理架构,成功将复杂事件处理(CEP)的延迟降低到亚秒级,同时保证了计算结果的精确性。DeepSeek研发的神经架构搜索(NAS)与知识蒸馏联合优化框架,可在保持模型精度的前提下,将参数量压缩至原始模型的1/100,实现边缘设备的实时AI推理。随着5G和物联网技术的普及,对实时处理能力的需求将呈指数级增长。

Programming Talk 291

【学习系列】SAP RAP 16:RAP应用部署集成至Fiori Launchpad 【On-Premise】

本文详细介绍了如何将开发完成的RAP应用部署到S4HANA 2023 On-Premise环境并集成到Fiori Launchpad的完整流程。主要内容包括:1)通过ADT工具创建Fiori项目并配置外部IDE(VSCode);2)使用npm命令部署应用到系统;3)通过事务代码创建语义对象、磁贴目录和目标映射;4)配置PFCG角色分配;5)补充了部署失败解决方案、翻译问题处理、自定义主题设置以及登录页面LOGO修改等内容。文章提供了step-by-step的操作指南,帮助开发者将预览模式的应用正式部署到生产

DeveloperMrMeng的博客 637

Java单例模式简单实现(singleton pattern)

单例模式,用来保证一个对象只能创建一个实例,同时,它还提供了对实例的全局访问方法。 单例模式只由单个类组成,实现简单。为确保单例实例的唯一性,构造器都要被声明为私有(private),然后通过声明静态(static)方法实现全局访问,获得该单例实例。 /** * 单例模式 * 所有的单例模式的(1)构造器都要被声明为私有的private, * (2)再通过声明静态方法static实现...

Janebook的博客 299

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 目录 解决问题 解决思路 解决方法 解决问题 安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 解决思路 发生未知错误。 解决方法 很可能是因为当前电脑下载的cuda版本不适合当前电脑GPU支持的cuda版本! 推荐文章:CV:Win1..

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 7525

C++ 实现单例模式

C++实现单例模式单例模式的基本概念基本实现完整实现 单例模式的基本概念 基本实现 #include<cstdio> class singleton { public: static singleton* get_singleton(){ if(instance_ == nullptr){ instance_ = new single...

zlgahu的博客 5594

VTK API 详解(103):vtkGPUVolumeRayCastMapper - GPU加速体绘制

是 VTK 中基于 GPU 的高效体绘制映射器,利用现代显卡的计算能力,通过射线投射算法实现快速且高质量的三维体积渲染。相比 CPU 版本的,GPU 映射器性能大幅提升,支持更复杂的光照和渲染效果,是体绘制的主流选择。是 VTK 中性能优异的GPU体绘制映射器;适合大数据集和实时交互应用;配合灵活设置颜色、透明度和光照;建议在支持OpenGL的环境中使用。

yumeiguo的博客 295

dolphinscheduler-3.4.0

dolphinscheduler集群部署

docsz的博客 660

单例模式(Singleton pattern)四种实现

[align=center][size=x-large]PART 1 快速预览[/size][/align] [list] [*][b]单例实现1:经典单例模式(Classic singleton pattern)[/b] [/list] [list=1] [*]实现延迟实例化(Lazy instantiaze);线程不安全(thread-unsafe) [*]可用来学习单例模式思想,...

futeng 256

H3LIS200DL三轴加速度传感器原理图设计,已量产(加速度传感器)

在最近的工业振动监测项目里,我们选了 ST 的 H3LIS200DL 做核心传感器 —— 这颗料的特点太契合场景了:±100g/200g 的大量程刚好覆盖设备冲击与振动的测量需求,10μA 的超低功耗能适配电池供电的边缘节点,0.5Hz 到 1kHz 的输出速率也足够抓准动态信号。下面结合实际画的原理图,拆解下这个硬件电路的设计思路。

不脱发的程序猿 338

单例模式的7种实现方式及比较

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例,即一个类只有一个对象实例。 – 百度百科 问题的由来 多个线程要操作同一对象,需要保证对象的唯一性。 解决思路 该类的构造方法为私有,防止外部实例化该类的对象 该类中要有一个对象实例化过程(只有一次) 该类需要提供返回实例对象的方法 解决方案 为了更...

zqhao的博客 6655

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java 利用枚举实现单例模式

引言单例模式比较常见的实现方法有懒汉模式,DCL模式公有静态成员等,从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法。Java枚举基本用法枚举的用法比较多,本文主要旨在介绍利用枚举实现单例模式的原理,所以这里也主要介绍一些相关的基础内容。 首先,枚举类似类,一个枚举可以拥有成员变量,成员方法,构造方法。先来看枚举最基本的用法:enum Type{ A,B,C,D; }创建en

yy254117440的博客 7万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

单例模式(五种实现)

单例模式 一、什么是单例模式 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。 单例的实现主要是通过以下两个步骤: 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对

weixin_45776349的博客 6976

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

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

Unity实现单例模式

在Unity中,(Singleton Pattern)是一种常见的设计模式,用于确保一个类在应用程序中只有一个实例,并提供全局访问点。单例模式在Unity中通常用于管理游戏中的全局系统,例如:游戏管理器(GameManager)、音频管理器(AudioManager)、UI管理器(UIManager)等。以下是一个完整的示例,展示如何在Unity中实现单例模式。

小宝哥Code的专栏 2223

C++单例模式实现

单例模式 单例模式:要求类只有一个对象实例,数据库连接池、线程池以及Windows任务管理器都是单例模式的应用。 那么如何去实现一个单例模式呢?C++中有5种实现的方式,首先从最简单说起 1. 单线程实现 常规写法 class Singleton{ public: static Singleton* getInstance() { if(_instance == nullptr) ...

一个不知名码农的专栏 3492

单例模式实现

实现线程安全的泛型单例模式 #ifndef __SINGLETON_H__ #define __SINGLETON_H__ #include <mutex> #include <memory> template <class T> class CSingleton { public: static T& Instance(); priva...

MaxMaxXiong的博客 512

单例模式的几种实现方式

单例模式的几种实现方式

水w的博客 1882

利用枚举实现单例模式

Java中的枚举是一个很容易被大家遗忘的知识点,鄙人在工作中也很少使用枚举,最近仔细整理了一下相关知识点吗,发现用好枚举可以为开发带来很多长处。 枚举早在JDK1.5就被引入了,应该是比较古老的特性了,那枚举具体可以用在哪些场景下呢? 1、常量的定义 2、switch的入参 3、单例模式的实现 在WEB开发中,经常需要封装一个ResponseDto类来返回一些调用的结果信息,如下: ...

FutureFlyme的博客 1万+

单例模式的C++实现

逻辑上,双检查锁是没问题的,一旦m_instance不为空,多线程都可以访问它,但可惜的是编译器优化会reorder,也就是汇编代码的顺序和高级语言代码顺序不是完全一致的,比如,new的过程会先分配内存,再执行类的构造函数,假设在分配完内存后,进行了线程切换,此时m_instance不是nullptr,但m_instance代表的对象可能还没有构造好就被使用了。,在其它语言中,如Java中不用这么复杂,给m_instance加个volatile关键字就行了,VC下也可以,但不是跨平台的。

qq_39980953的博客 1755

单例模式声明与实现

#ifndef _COM_MACRO_DEF_H_ #define _COM_MACRO_DEF_H_ // 单例模式申明 #define PATTERN_SINGLETON_DECLARE(classname)\ public:\ static classname* Instance();\ static void Close();\ private:\ static classname* m_pSingletion; // 单例模式实现 #define PATTERN_SINGLETON_IMP.

wy749929317的博客 279

单例模式的最佳实现

1.饿汉单例模式         在装载该单例类的时候就会创建类实例,实例代码如下所示: public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton getInstance() { re...

Gandoph的博客 1946

单例模式双重检查锁到其他更好的单例模式实现方式

/ 在进入同步块后,会把 getInstance() 等所有加锁的静态方法都阻塞掉,然后在同步块内的代码执行完成后,释放锁,其它第一次判断为空的排队中的线程会获取到锁,然后在第二次判断是否为空的时候会发现实例非空,就会直接返回实例,而不是再创建一次。// 因为在判断为空时,就会创建实例,在此过程中,就可能有其他线程发现实例非空,会直接返回未创建好的实例,这就会造成问题。// 所以要在创建实例的临界区,加上锁,即在同步块里,创建实例。// 静态方法加锁会阻塞 类的加锁的静态方法。

m0_63516092的博客 387
上一篇: mysql limit的注意事项
下一篇: 继承类之间的执行顺序
studyjavalm1017
博客等级 码龄19年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值