Singleton Pattern 两种实现的选择

单例模式(Singleton Pattern)详解 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。核心目标: 控制实例数量:防止重复创建对象,节省资源。 统一管理共享资源:如配置管理、数据库连接池、日志处理器等。 阅读详情

    单件模式就不用多介绍了,其实现有两种主流的思路:Double Check和Static,两种方案的C#终极代码大致如下。


方案一:加锁

 

方案二:静态构造


方案一的代码还不够终结,有一些特殊的关键字没有加,不过结构就是这样了。这是最传统的思路,加锁来防止并发,演化为使用双判断来最大化的避免并发。优点是稳重可靠,缺点是使用锁损耗性能。

方案二的思路是利用静态构造的特性,来保证成员只会被加载一次。很巧妙,但是有个缺点是所需的单件实例加载的会太早,于是有了这个终极方案,使用嵌套类来延迟加载。更加巧妙,优点很显然,性能没有缺陷,缺点么,只能在静态构造器中实例化。


    我以前是很喜欢方案二的,讨厌加锁,而且利用静态构造器自己琢磨出来过,很有感情。所以仅从代码实现面上考虑,方案二绝对好于一。

但是方案二有个致命的缺陷,至少我一直没有办法弥补:

如果初始化时失败了,如何恢复?


    假设我们用方案二提供一个单件的消息服务连接,当第一次访问的时候,网络恰巧断线了,创建连接失败,对象为null。当第二次访问的时候,当然还是null,如何恢复呢?因为这时候无法再利用静态构造器了,难道你要抛个异常告诉Admin,请重启程序来重新连接么。只好每次访问的时候都判断并实例化,显然这需要加锁的,又回到了第一种方案上了。或者使用标志来记录状态、或使用循环来自我恢复,还是都需要加锁的,只是位置不同而已。何况,即便是初始化成功,第N次连接失败,第N+1次也是应该尝试恢复的。

    那么还有一种场景也不好用方案二,就是提供的这个单件需要释放对象、更改状态。方案二是无法提供这些功能的。道理很显然,更改了之后你无法恢复。

  

   所以,两者的比较要补充:Double Check的适用面是完美的,性能有损;Static的性能是完美的,适用不强。

   凡是需要对外提供更改状态、或者会有异常引起内部状态变更的服务,都不适用方案二来实现。换句话说,绝对只读的、异常可控的单件服务,才适合使用方案二实现。其他的情况,您还是老老实实的用锁吧。毕竟需求第一,性能靠后。

 

   当然,按照大师们所说,若是您能够把单件模式都重构掉可以不用,那是最好不过了。


-------------

今天居然不加班了,影响了计划。

写点小东西找找感觉,结果优快云很卡,没感觉。而且用IE打开比用FF还慢了一倍。

山东大学机器学习(实验一内容)——线性回归 1. 描述 第一个练习将为你提供线性回归练习。这些练习已经用Matlab进行了广泛的测试,但它们也应该在Octave中工作,它被称为“免费版的Matlab”。如果你使用的是Octave,那就是 一定要安装Image包(可在Windows中作为选项使用)安装程序,可从Octave-Forge获得Linux。 2.线性回归 回想一下,线性回归模型是 hθ(x)=θTx=∑j=0nθjxj h_{\th... 阅读详情

相关推荐

matlab中高频变压器怎么找,干货|手把手教你绕制高频变压器

原标题:干货|手把手教你绕制高频变压器绕制一个变压器所需材料:磁芯、骨架、各种铜线、麦拉胶带。变压器参数:磁芯:EE22原边:134T(1-3脚),辅助:32T(5-4脚),输出:15T(10-9脚)原边电感:1380±10%uH漏感:≤44uH引脚分布图: 特别注意:绕制方法为网上下载,其中变压器绕制方法是对的,但其中存在着很多问题(比如,正规变压器的绕组的头和尾是要添加铁氟龙套管的,每一层之间...

weixin_30895121的博客 2125

javax.validation常用的校验

1.手机号码 @NotNull(message = "手机号码不能为空") @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号码范围不正确") private String phone; @NotEmpty(message = "手机号不能为空") @Pattern(r

xiegongmiao的博客 9604

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1685

SpringBoot中实现业务校验,这种方式才叫优雅

在日常的接口开发中,为了保证接口的稳定安全,我们一般需要在接口逻辑中处理两种校验: 参数校验 业务规则校验 首先我们先看看参数校验。 参数校验 参数校验很好理解,比如登录的时候需要校验用户名密码是否为空,创建用户的时候需要校验邮件、手机号码格式是否准确。 而实现参数校验也非常简单,我们只需要使用Bean Validation校验框架即可,借助它提供的校验注解我们可以非常方便的完成参数校验。 常见的校验注解有: @Null、@NotNull、@AssertTrue、@AssertFalse、@

a1472750149的博客 3000

PyCharm 2023最新版安装配置全攻略(附永久激活教程)

本文详细介绍了PyCharm 2023最新版的安装配置全流程,包括版本选择、初始配置、插件生态、工程模板、调试优化及团队协作等关键步骤。特别针对专业版和社区版的功能差异进行对比,帮助开发者高效搭建Python开发环境,提升编码效率与团队协作能力。

p4q5r6s7t的博客 869

静态时序分析(STA)_深入解析Data to Data Checks的零周期挑战

本文深入解析了静态时序分析(STA)中Data to Data Checks的核心概念与零周期挑战。重点探讨了当Setup要求值超过时钟周期时,工具如何调整发射沿,并导致Hold检查的发射与捕获沿“分裂”这一反直觉现象。文章通过案例详细解读了时序报告,并提供了通过调整约束或接受多周期保持两种策略来应对这一挑战,帮助工程师正确理解和处理此类复杂时序检查。

weixin_29204205的博客 351

正则表达式

[正则表达式]文本框输入内容控制 2 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 3 只能输入数字:"^[0-9]*$"。 4 只能输入n位的数字:"^\d{n}$"。 5 只能输入至少n位的数字:"^\d{n,}$"。 6 只能输入m~n位的数字:。"^\d{m,n}$" 7 只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)...

wang_2011_ying的专栏 895

用 CL_ABAP_PARALLEL 把批量处理跑进并行对话进程:资源配额、超时治理与可复制的落地模板

文章摘要: CL_ABAP_PARALLEL是SAP推荐的并行处理工具,适用于时间窗口受限的批量任务处理。它基于aRFC/pRFC机制,通过对话进程实现并行,能将小时级任务压缩到分钟级。使用时需注意版本兼容性(可能需要Note 2791374)、资源限制(会话数、进程数)和任务切片策略。提供两种实现方式:继承式(重定义do方法)和接口式(实现IF_ABAP_PARALLEL)。关键参数包括并发控制(p_percentage)、超时设置(p_timeout)和调试开关(p_debug)。最佳实践建议按业务维度

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

Design Pattern: Registry of Singleton 模式

学习是分享和合作式的! 转载请注明出处:http://blog.youkuaiyun.com/wdzxl198/article/details/9223275;  文章摘自: http://www.riabook.cn/doc/designpattern/;  考虑使用 Singleton 模式 时拥有子类别的问题,在Singleton模式中的getInstance()通常是一个静态方法,不能在子

Atlas2013的专栏 1136

【Coze】在Coze平台使用源码创建工作流

Coze平台提供低代码工作流搭建功能,支持通过图形化界面快速构建自动化任务流程。用户可通过资源库创建工作流,导入JSON配置生成节点结构,连接起始节点并配置输入/输出字段(需定义数据类型)。平台提供试运行功能验证流程执行,支持可视化调试与发布上线。该方案适用于快速部署标准化业务逻辑,实现端到端的自动化处理。

Mr数据杨 2430

【C语言】一文带你拿捏分支和循环语句(一万字详细讲解)

if/switch语句、while/fo/do...while循环语句、goto语句详解

StackFrame 1233

state pattern 的应用实例

  上图是我解决MATLAB中基本类Array的STATE PATTERN 实现,每个STATE子类是一个SINGLETON模式,Array中的void * m_data根据当前状态决定是什么类型的指针。采用这种方式的好处1、可复用complex string 等2、改变类型不需要重新分配类(某些实现需要重新分配类),例如,template实现3、一元操作符不需要循环判断4、m_dat

d_jt的专栏 691

让 IF 更好读:在 ABAP 里尽量使用正向条件的实战指南

摘要:SAP系统开发中,代码可读性与可维护性的关键往往在于条件判断的写法。Clean ABAP风格指南建议尽量采用正向表达的条件判断,如使用has_entries = abap_true而非否定式写法。正向表达能降低理解成本,避免"否定的否定"带来的逻辑混乱,但不应为追求正向而制造空分支。在团队协作中,正向条件更利于代码评审和测试覆盖,建议通过工具检查和智能评审确保规范执行。落地时可关注变量命名正向化、避免空分支、主流程清晰展开等要点,以提升长期维护效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

Implementing the Singleton Pattern in C# [转载]

Implementing the Singleton Pattern in C# [转载] view auther's website The singleton pattern is one of the best-known patterns in softw...

177

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

singleton pattern 单例模式

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

TIANTIAN_ZZ的博客 224

假人有限元模型

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

muduo之Singleton

muduo中的单例模式 Singleton.h // Use of this source code is governed by a BSD-style license // that can be found in the License file. // // Author: Shuo Chen (chenshuo at chenshuo dot com) #ifn...

1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Singleton Design Pattern and Thread Safety

http://www.codeproject.com/Articles/96942/Singleton-Design-Pattern-and-Thread-Safety Introduction Okay, you're not a newbie, you know all about singletons (only one object instantiation during pro

a19576的专栏 828

深入解读单例模式(Singleton Pattern)及其实现方式

单例模式的核心思想是确保一个类在整个应用生命周期内只有一个实例。它通常应用在需要共享资源或进行全局配置的场景,例如日志管理器、配置文件读取器、数据库连接池等。单例模式的实现方式有很多,每种方式都有其优缺点。选择哪种实现方式应该根据实际需求、项目复杂度以及对性能的要求来决定。如果你需要线程安全且不在乎资源浪费,可以使用饿汉式。如果需要懒加载,且对性能要求较高,可以选择双重检查锁或静态内部类。如果代码简洁且避免反射攻击是你的首要目标,可以选择枚举式。在大多数情况下,静态内部类和枚举式。

一碗黄焖鸡三碗米饭的博客 988

设计模式 - 创建型模式_ 单例模式 Singleton Pattern

单例模式常见的写法有: 懒汉式单例,饿汉式单例,登记式单例(可忽略)。单例模式特点: 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一对象实例 单例模式确保某各类只有一个实例,而且自行实例化并向整个系统提供这个实例。比如我们常见的线程池 、缓存等等。选择单例模式就是为了避免不一致的状态,避免政出多头。懒汉式单例 特点: - 懒汉式单例在第一次调用的时候

小工匠 3万+

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

详细介绍了单例模式的各种实现

mazouri的博客 1万+

单例模式(Singleton Pattern)

单例模式(Singleton Pattern)

19.2.04.157N的博客 522

【设计模式】单例模式 Singleton Pattern

Java的对象,通常需要我们new出来,大多数时候,应对这种情况,我们很容易想到,只保持一个对象,并提供全局的访问,在并发的场景下,让它线程安全。

神也在Cpoy 1510

Singleton Pattern

Singleton pattern is to make sure only 1 instance is created through entire project, it's applicable when object creation is complicated but 1 instance is enough, like tool class, property object or session, it can help avoid space waste. In total there a

CarterDeng的博客 126

Java:单例模式(Singleton Pattern)及实现方式

本文介绍了Java中单例模式的概念机多种实现方式,包括饿汉式、懒汉式、同步方法懒汉式、双重检查锁定、静态内部类和枚举。每种方式都有其优缺点和适用场景:饿汉式简单但可能浪费资源;懒汉式延迟加载但非线程安全;同步方法懒汉式线程安全但性能低;双重检查锁定和静态内部类都提供了线程安全和延迟加载的解决方案;枚举是最简洁安全的单例实现,防止反射和序列化破坏。文章总结了对不同场景的选择建议,并提醒谨慎使用单例模式,以防代码耦合度高和难以测试。

It_BeeCoder的博客 1850
上一篇: Silverlight的使命与前景
LifeForCode
博客等级 码龄21年 41粉丝 8原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值