设计模式-单例模式-饿汉和懒汉
单例模式在编码时,可分成 饿汉和懒汉;
饿汉式:当类进行初始化的时候,为该类分配内存,并创建对象。
懒汉式:当类进行初始化的时候,对象不创建,等到使用的时候才创建。
写饿汉式,记得如下:
1. 保证单例,即构造方法得私有
2. 变量需要是 static 和 final ,并且为变量直接创建对象(static可方便方法直接获取,final保证对象引用不可变)
3. 获取 该类对象的方法必须是static的
代码如下:
public class HungrySingle { private static final HungrySingle hs = new HungrySingle(); private HungrySingle(){} public static HungrySingle getInstance(){ return hs; } }
写双重检查懒汉式,记得如下:
1. 保证单例,即构造方法得私有
2. 变量需要是 static 和 volatile,不需要提前赋值。(static可方便方法直接获取,volatile避免指令重排序)
3. 获取 该类对象的方法必须是static的
4. 方法内部进行 双重判断 内架 一个 同步代码块。这里解释下:为啥 synchronized 前后都加了 if(xx == null)的判断,说结论:为了缓解同步锁导致的效率变慢的问题。我给大家举个例子:
一所房子里有一部手机,一次只能进1个人,谁先进去拿走手机就是谁的,后面的人进去就没了。这样会出现什么问题?就是明明第一个就已经拿了手机走了,后面的人还一个又一个排着队进去看手机还在不在,最正确的做法是后面的人一起进去看,手机不在了可以走人了。这样效率多块呀。
同样的道理,最外层的if(xx == null)就是为了给后面这群人(线程)所准备的
代码如下:
public class LazySingle { private static volatile LazySingle lazySingle; private LazySingle(){} public static LazySingle getInstance(){ if(lazySingle == null){ synchronized (LazySingle.class){ if(lazySingle == null){ lazySingle = new LazySingle(); } } } return lazySingle; } }
对上面代码有不惑可参考:https://blog.csdn.net/yeyazhishang/article/details/90445330
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2020-03-08 JDBC原理
2020-03-08 JDBC入门