设计模式-单例模式
admin
2024-02-26 13:56:56
0

单例模式

保证一个类只有一个实例,并提供一个访问该实例的全局节点。
为啥要保证一个类只有一个实例?
如控制某些共享资源的访问权限,例如数据库或文件;
如为避免频繁创建一个可复用的对象,需要仅在首次时初始化;
怎么保证一个类只有一个实例?

懒汉式

静态内部类

巧妙利用Java类加载机制,保证多线程环境下的线程安全性。当一个类被加载时,其静态内部类是不会同时被加载的,只有第一次被调用时才会初始化,而且不能通过反射的方式获取内部的属性。

public class Singleton{private Singleton(){}public static Singleton getInstance(){return SingletonInstance.instance;}private static class SingletonInstance{private static final Singleton instance = new Singleton();}
}

双重检锁

在多线程环境下,为了提高实例初始化的性能,不是每次获取实例时在方法上加锁,而是当实例未创建时才会加锁。
这里使用volatile对instance进行修饰,是因为volatile禁止指令重排,保证了线程安全性。
创建一个对象的步骤非原子操作,大致可以分为3部分,
(1)给instance分配内存
(2)调用实例Singleton的构造函数初始化instance
(3)将instance指向分配的内存地址
在多线程情况下,假设A线程执行创建instance的操作,对于B线程有俩种状态,(1)(2)下为null, (3)下为非null;在创建对象不是一个原子操作的前提下,CPU为提高运行效率,可能会对3个操作进行指令重排,如果重排后指令执行顺序是1,3,2,那么B线程获取到instance状态。是未赋值下的状态,即可能是null
volatile禁止指令重排,通过添加读屏障和写屏障,保证在该变量不会把其后面的指令重排到内存屏障之前,不会把其前面的指令重排到内存屏障之后。

public class Singleton{private volatile static Singleton instance;public static Singleton getInstance(){if(instance == null){synchronized(this){if(instance == null){instance = new Singleton();}}}return instance;}
}

饿汉式

类加载的时候就创建实例,使用私有构造函数实现全局单个实例的初始化,并使用public static final修饰,实现延迟加载和保证线程安全性。

public class Singleton{private static final Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){return instance;}
}

枚举式

它能够保证序列化和反序列化过程中实例的唯一性,而且不用担心线程安全问题。

public enum Singleton {SERVICE_A {@Overrideprotected void hello() {System.out.println("hello, service A");}},SERVICE_B {@Overrideprotected void hello() {System.out.println("hello, service B");}};protected abstract void hello();}

参考链接

单例设计模式
Netty中的设计模式
Java并发编程

相关内容

热门资讯

银行板块震荡上扬 中国银行等股... 观点网讯:7月8日,银行板块震荡上扬,中国银行、农业银行、建设银行、成都银行、工商银行等股纷纷上扬。...
AI Agent进入深水区:企... AI Agent从技术概念走向商业落地,企业付费意愿成为检验产品价值的唯一标准。过去两年大量AI创业...
一通智投APP内幕交易欺骗投资...   一通智投APP虚假现货订购交易为非法期货,投资者被宣传广告给诱导,下载了一通智投APP,结果在这...
港股科技股全线大涨!跌多了是基... 港股市场近日整体有明显反弹的科技股今日再度集体走强,恒生科技指数拉升涨超3%。个股中,联想涨超8%,...
一场博览会,看透低空经济风口全... 文丨许佳慧 低空经济风起,谁是真正的弄潮儿? 【观赛道:题材风口开启,全链布局成型】 低空经济有多火...
黄金单边牛市没那么快回来?预测... 黄金这波反弹刚冒头,没人敢直接砸重仓赌方向。Polymarket上的交易显示,黄金7月触及4300美...
超颖电子布局“A+H”:一季度... 瑞财经 吴文婷7月6日,超颖电子发布公告称,为满足公司业务发展需要,深入推进国际化战略,打造国际化资...
偏袒?阿根廷球员扇耳光+飞铲无... 北京时间7月8日,2026年世界杯1/8决赛,阿根廷3-2逆转埃及晋级八强。不过,本场比赛的判罚在赛...
原创 高... 在国际关系的复杂棋局中,盟友与对手从来都不是一成不变的。最近,俄罗斯通过中间渠道从日本进口航空燃油的...
优质药食同源食材选购指南:甘草... 在现代保健理念中,药食同源的概念越来越受到重视。许多人开始关注如何选购优质的药食同源食材,以便更好地...
AI产业进展提振信心,科创创业... 截至7月8日11点15分,上证指数涨0.28%,深证成指跌0.28%,创业板指涨0.51%。油气开采...
将多色3D打印提速5倍,消费级... 消费级3D打印企业快造科技(Snapmaker)近日完成10亿元C轮融资。本轮由凯辉基金领投,好未来...
“物理AI第一股”来了!Mom... 2026年7月8日,全球领先的物理AI公司Momenta正式在港交所挂牌上市,股票代码为6880.H...
投资需求增长的核心动力是什么? 在金融市场中,投资需求的增长受到多种因素的综合推动,这些因素构成了投资需求增长的核心动力。 首先,经...
苏州得鹿食品有限公司成立 注册... 天眼查App显示,近日,苏州得鹿食品有限公司成立,法定代表人为周锋,注册资本50万人民币,经营范围为...
刚刚,又一家厦门企业在港股上市... 最新消息! 厦门又迎来一家上市公司! 7月8日 厦门瑞为信息技术股份有限公司 (以下简称“瑞为技术”...
韩国综合指数转涨,盘初一度跌近... 8日,韩国综合指数转涨,一度涨超1.6%,现涨0.7%,盘初一度跌近4%。个股方面,SK海力士涨近4...
原创 7... 四千多欧洲人因为高温没了命,大半是装不起买不起空调的独居老人。现在老百姓抢着买能解决问题的中国空调,...
【明辉说油】美国撤销对伊朗石油... 市场讯息:7月7日(周二),美国取消对伊朗的售油豁免期,且伊方表示美国违反停火协议加剧紧张氛围,国际...