双检锁(DCL)实现懒汉单例模式
public class Singleton{
private volatile static Singleton obj;
public Singleton(){}
public getSingleton(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
obj = new Singleton();
}
}
}
return obj;
}
}
- 为什么使用两次if判断?
因为多线程环境下只有创建单例对象时才会产生竞争。如果已经有实例化对象,则不需要进入加锁的步骤,直接返回,提高效率。第二次判断是防止创建出多个实例,多个线程进入第一个if时,一个线程释放了锁,其他线程会获取锁,从而导致多个实例创建,第二个if就是为了避免创建多个实例。 - 为什么使用了synchronized关键字还要使用volatile关键字?
synchronized是为了保证多线程环境下的线程安全,而volatile是为了禁止指令重排。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署