Singleton Pattern 单态模式

Singleton Pattern 单态模式。

这个模式较简单,就是为了保证一个类只有一个实例,用一个入口来获取该实例。

例子如下(代码来自维基):

class Foo {
private static Helper helper = null;
private Foo(){}
public static Helper getHelper() {
if (helper == null)
helper = new Helper();
return helper;
}

// other functions and members...
}

由于构造方法设为了私有,所以其它类无法使用new 来生成该类实例,只有通过
该类自己提供的方法来获取实例。这个获取实例的方法通总是使用第一次创建的
实例而保证其它类总是使用同一个实例。

本来很简单,但是在多线程情况下则会有些麻烦。两个线程都有可能执行到了第
6行,这样就有可能创建2个实例。过程如下(线程1简称为T1,线程2 简称T2):

T1 5 (5代表第5行)
T2 5
T1 6
T1 7 (线程1返回一个实例)
T2 6
T2 7 (线程2返回另一个实例)

这样就破坏了实例唯一性。如果这两个实例状态不会变化,倒也无所谓,就是多
花点内存养两个对象。但如果这两个实例涉及到计数器等状态变化,就埋下了隐患。

解决办法是加上同步关键字,如下:

    public static synchronized Helper getHelper() {
if (helper == null)
helper = new Helper();
return helper;
}


问题是解决了,但效率却降低了。因为每次获取实例都会执行同步运算。实际上
没必要。一旦实例创建并返回,以后再获取实例就不会执行第6行。为了发生几率
很小的事件而每次同步的方法,代价太大了。

不同虚拟机对同步方法的执行效率不同,早期虚拟机执行同步效率非常的低。现
在改进了很多,但进入线程体、离开线程体、加锁、解锁这些步骤仍然耗费性能。

所以,后来发明了双检查锁模式。(Double-Checked Locking Pattern)。在
《DesignPatternsExplained》一书中,作者专门分析了这种方法的优势,并给出
了代码。代码如下:

class USTax {
private static USTax instance;
private synchronized USTax(){};
public static USTax getlnstance () {
if(instance== null)
instance= new USTax();
return instance;
}
}


不想,书上印错了,这让很多人包括我迷惑良久。后来书本经过更正,变为如下形式,

class USTax {
private static USTax instance;
private USTax(){};
public static synchronized void doSyn(){
if(instance== null){
instance= new USTax();
instance.setSomething();}//这句是我加的,为方便接下来的解释。
}
public static USTax getlnstance () {
if(instance== null)
doSyn();
return instance;
}
}


到此,算是万事大吉了。不料这种双重检查模式仍然有问题,并不能解决多线程
的问题。由于这本书的广泛流传,这种模式也广为人知。当这种模式的错误之处
被发现后,很快就出现了对这种模式广泛的讨伐之声。可见,影响越大,一旦有
错,被讨伐的力度也就越大。

我们以上面这段代码为例,看看问题是怎样产生的,

T1 10 (线程1执行到第10行)
T1 5
T1 6
T2 10
T2 12

也就是说,线程1还没有完全构造完这个对象(还没有执行第7行),线程2就返回
这个半成品对象了。所以,这种谬种流传的 Double-Checked Locking Pattern也
就寿终正寝,不能再被使用了。

那这种多线程出现的问题该怎么做呢,解决方法也很简单,如下即可,

class USTax {
private static USTax instance = new USTax();
private USTax(){};
public static synchronized void doSyn(){
if(instance== null)
instance= new USTax();
}
public static USTax getlnstance () {
return instance;
}
}
【HSPiP应用指南】从理论到实践:如何利用汉森溶解度参数优化配方设计 本文深入解析了汉森溶解度参数(HSP)理论及其在配方设计中的核心价值,并详细介绍了如何利用HSPiP软件工具从理论走向实践。文章通过匹配溶解度参数、计算汉森距离(Ra),系统阐述了如何解决溶剂选择、颜料分散稳定性及扩散行为预测等关键问题,并结合界面气相色谱(IGC)等实验方法提升预测精度,旨在帮助配方师实现配方设计的可视化、可量化与高效优化。 阅读详情

相关推荐

Carsim与AVL CRUISE联合仿真:从零搭建整车模型的实战指南

本文详细介绍了如何从零开始搭建Carsim与AVL CRUISE联合仿真整车模型,涵盖软件环境配置、接口设置、模型连接及调试技巧。通过联合仿真,可充分发挥Carsim在车辆动力学和AVL CRUISE在动力系统仿真方面的优势,为电动车和混合动力汽车的研发提供精准的整车模型分析。

weixin_29067143的博客 939

第3章 单态模式【Singleton Pattern】

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

努力成为架构师的王大雄 269

BUSCO评估基因组的完整性

因为数据库收集的时候找的就是在不同的物种间都是单拷贝的基因,所以说在评估的物种里面应该也是单拷贝的状态才对。基因组层面评估:先去基因组上预测这些基因,再去做评估,如果说给他是一个注释好的基因集,这个时候提供的是一个蛋白集合,它就直接是去进行同源搜索,再去评估,看BUSCO数据库里面的这些单拷贝基因有或者无;首先,tblastn也是同源搜索,同源搜索之后,去对转录本进行读码框预测,预测完的结果还是去进行hmmsearch的搜索(hmmsearch是做蛋白质结构域搜索的),最终拿到BUSCO评估结果。

qq_64400864的博客 2960

单态设计模式(Singleton Design Pattern)

1 基本概念   单态模式是设计模式中最为人熟知的也是形式最简单的。它的基本概念是一个类只生成一个实例。  2 应用   Singleton的应用有很多,譬如对数据库只能有一个连接,或者对网站的连接数的计数器。  3 几种形式   基本形式是使用private constructor和一个public的static方法来获得类的实例。 [java

u014072347的专栏 872

水星路由器+群晖NAS+外网访问

水星路由器+群晖NAS+外网访问 有了公网IP,家里是水星路由器的 怎么设置外网访问 1.先电脑登录群晖的http://【你的群晖名】.quickconnect.to/ 2.【控制面板】进入设置 3.选择synology依次设置 ,【主机名称】就是你的名称。注意:左下角第7步,一定勾选。 4.下面进入192.168.1.1水星路由器设置。【IP与MAC绑定】点击NAS对应的【绑定】注意,点这里之前Nas一定设置了固定内网ip(后面补充 )。 5.【高级用户】-虚【拟服务器】。常用服务器不用选,其他的对应

wjxue201的博客 2600

LwIP TCP Client 解决长数据发送的困扰

问题描述 LWIP 的 TCP Client 发送数据可以调用 tcp_write() 函数,将数据储存在缓冲区里面,然后等待超时自动发送或者调用tcp_output()函数进行发送。 然而 tcp_write() 函数 需要发送的数据过长时,将无法发送,并返回 ERR_MEM。 tcp_write()函数解析 tcp_write()的函数代码很多,就不细看代码了, 先看tcp_write()的完整函数: err_t tcp_write(struct tcp_pcb *pcb, const void

tiantangmoke的博客 1万+

设计模式之单态模式(Singleton Pattern)

quote:看过很多次,但是第一次开始把自己看过的写出来,希望能够加深自己的理解。同时如果对大家有一点点帮助就更好了。 设计模式中单态模式用来确保一个类只有一个实例化对象。比如多人协作的黑板画,大家都是对一块黑板进行修改,所以只能有一个黑板实例。 实例代码如下: package com.wphoenix9.singelton; /** * 单态模式就是指一个类只能够实例化一个对象

DODO~下雨不打伞 958

第170篇 因子图优化入门——图模型在状态估计中的应用

本文系统介绍了从滤波方法到因子图优化的思维转变,重点解析了因子图的原理与应用。首先对比了递推式滤波(卡尔曼滤波等)与全局优化的区别,指出优化方法能利用所有信息且适合处理稀疏结构。然后详细阐述了因子图的二部图结构(变量节点和因子节点)及其将复杂概率分布分解为小因子乘积的优势。文章讲解了因子图优化如何转化为最小二乘问题,并介绍高斯-牛顿法和LM方法等求解技术。最后对比了g2o、Ceres和GTSAM三大主流框架的特点及适用场景,强调了初始化和鲁棒核函数的重要性,为SLAM相关面试提供了实用建议。

郑伟强dev的专栏 374

单例/单态模式(Singleton Pattern)

百度词条的解释 http://baike.baidu.com/view/1859857.htm <?php //单例模式 final class PSV { private $loan = false; private static $myPSV; public function getInstance() { if(!isset(self::$myPSV)) { self

天行健,君子自强不息 397

基于Termux的Android平台OpenClaw部署:移动端AI助理实现

本文介绍了在Android设备上通过Termux部署OpenClaw AI助理的方案。Android设备的便携性、Termux提供的完整Linux环境以及多样化的硬件配置使其成为理想的部署平台。文章详细分析了不同级别Android设备的硬件规格(从入门级到旗舰级),并提供了最低/推荐配置要求。部署步骤包括Termux安装初始化、Python环境配置以及性能优化建议。该方案充分利用Android设备的传感器和电池供电优势,为移动办公、学习等场景提供了低成本、高便携性的AI助理解决方案。

博客 3015

YOLOv11-seg 改进系列 | 引入原创 RSCD 重参数共享卷积分割头,增强 Head 表达力并压低计算量

本文提出一种改进的YOLOv11-seg分割头Segment_RSCD,通过重参数共享卷积增强表达能力。该模块在LSCD共享检测头基础上引入DiverseBranchBlock重参数卷积,保留三尺度预测与Proto掩码原型接口不变。相比原始Segment头,Segment_RSCD参数增加4%但计算量降低1.3%,在共享卷积结构中通过多分支补偿表达能力损失,同时利用Scale层保持尺度差异校准。该方法不改动Backbone/Neck结构,仅重构检测/分割头,实现训练期多路径聚合与部署期等效单分支的平衡。

qq_44224801的博客 184

单态设计模式(Singleton pattern)

单态(单例)设计模式   单态设计模式(Singleton pattern)就是要保证在整个程序中某个类只能存在一个对象,这个类不能再创建第二个对象。 单态设计模式的写法   私有化构造函数,阻止创建新对象。 单例设计模式: 在内存中对象只有一个存在。 */ //饿汉式 class Student { private Student(){} ...

129

A2B V1.0协议学习笔记(A2B System Specification V1.0)

A2B全称是 Automotive Audio Bus 汽车音频总线,主要是解决传统音频总线线多、线重、成本贵等问题。本文是以A2B V1.0规范为准,现在ADI又推出了A2B V2.0,物理层不兼容,采用了QPSK编码方式,后续有时间再更新。A2B总线的优点:支持1主多从的架构(最多10个子节点)支持50Mbps(具体是49.152 Mbps)的高带宽传输以及

qflook的博客 4428

单态模式Singleton Pattern

图是自己使用processon网站在线制作的,这个网站很好用,推荐大家用。

Spider--Man 409

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

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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

The Singleton of Design Pattern单态模式

1 SingletonDefinition单态模式定义 The main purpose is to gurantee that the instance ofclass has only one in the application. some operations, such asconnecting to database, are userfulforon...

weixin_34186950的博客 74

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

单态模式(Singleton Design Pattern)

enum season{             summer; }单态模式 1 基本概念 单态模式是设计模式中最为人熟知的也是形式最简单的。它的基本概念是一个类只生成一个实例。 2 应用 Singleton的应用有很多,譬如对数据库只能有一个连接,或者对网站的连接数的计数器。 3 几种形式 基本形式是使用private constructor和一个

u014087169的专栏 380

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

单列模式(Singleton Pattern、单态模式、单件模式、对象创建型模式)

意图唯一的对象实例 保证一个类仅有一个实例,并提供一个访问他的全局访问点 有状态(可变的单例对象,可以组成状态仓库)、无状态(工具类)适用性在下面的情况下可以使用Singleton模式: 1. 当类只能有一个实例而且客户可以从一个总所周知的访问点访问它时。 2. 当这个唯一实例应该是通过子类可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 3. 系统只需要一个实例的对象,

sld880311的专栏 505

java设计模式之创建型模式——单态模式(Singleton Pattern)

[b][size=medium](根据收集的各个资料整理而得~) 一、单态模式的定义 Singleton模式要求一个类有且仅有一个实例,并且提供一个全局的访问点。 二、使用Singleton注意事项: 有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB(Enterprise Java Bean...

iteye_16768的博客 168

设计模式之Singleton(单态)

<br />单态定义:<br />Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 <br />在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。<br />还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的

bingyuehanxue_11的专栏 408

设计模式总结

1.单态设计模式(Singleton Design Pattern) 基本概念:一个类只生成一个实例。 应用:譬如对数据库只能有一个连接,或者对网站的连接数的计数器。 形式1: public class Singleton {      private static Singleton instance = new Singleton();         private Si

Jerry's Home 534

单例模式

为什么80%的码农都做不了架构师?>>> ...

weixin_33774883的博客 88
下一篇: 亨元模式(Flyweight pattern)
mmonkeyer
博客等级 码龄23年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值