完美解决单例设计模式中懒汉式线程安全的问题

发布时间 - 2026-01-10 22:09:01    点击率:

首先写个单例:

public class SingleDemo { 
  private static SingleDemo s = null; 
  private SingleDemo(){} 
  public static SingleDemo getInstance(){ 
    if(s == null){ 
      s = new SingleDemo(); 
    } 
    return s; 
  } 
} 

写个测试类:

public class ThreadDemo3 { 
   
  public static void main(String[] args) { 
    SingleDemo s1 = SingleDemo.getInstance(); 
    SingleDemo s2 = SingleDemo.getInstance(); 
    System.out.println(s2 == s2); 
  } 
} 

运行结果一直都是true,说明单线程下是没问题的,下面写个多线程来访问单例

public class ThreadTest implements Runnable { 
  //存放单例对象,使用Set是为了不存放重复元素 
  public Set<SingleDemo> singles = new HashSet<SingleDemo>(); 
  @Override 
  public void run() { 
    //获取单例 
    SingleDemo s = SingleDemo.getInstance(); 
    //添加单例 
    singles.add(s); 
  } 
} 

使用多线程并发访问单例:

public class ThreadDemo3 { 
   
  public static void main(String[] args) { 
//   SingleDemo s1 = SingleDemo.getInstance(); 
//   SingleDemo s2 = SingleDemo.getInstance(); 
//   System.out.println(s2 == s2); 
    ThreadTest t = new ThreadTest(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    new Thread(t).start(); 
    System.out.println(t.singles); 
  } 
} 


运行结果如下:
[com.persagy.thread.SingleDemo@1bc4459, com.persagy.thread.SingleDemo@150bd4d]

[com.persagy.thread.SingleDemo@12b6651]

说明有线程并发访问安全问题,获取的不一定都是同一个实例

如何解决线程安全问题呢?

当然使用同步锁机制了啊

下面改进单例:

public class SingleDemo {
	private static SingleDemo s = null;
	private SingleDemo(){}
	public static synchronized SingleDemo getInstance(){
		if(s == null){
			s = new SingleDemo();
		}
		return s;
	}
}

加入同步函数后线程安全问题解决了

运行多次都是获取同一个实例,不会出现2个实例的情况了

[com.persagy.thread.SingleDemo@12b6651]

但是在多线程并发访问的情况下,每个线程每次获取实例都要判断下锁,效率比较低,为了提高效率,我加入了双重判断的方法,解决了效率的问题

代码如下:

public class SingleDemo {
	private static SingleDemo s = null;
	private SingleDemo(){}
	public static SingleDemo getInstance(){
		/*如果第一个线程获取到了单例的实例对象,
		 * 后面的线程再获取实例的时候不需要进入同步代码块中了*/
		if(s == null){
			//同步代码块用的锁是单例的字节码文件对象,且只能用这个锁
			synchronized(SingleDemo.class){
				if(s == null){
					s = new SingleDemo();
				}
			}
		}
		return s;
	}
}

用这种方式解决了懒汉式的线程安全问题,也提高了效率,但是在实际开发中还是用饿汉式的比较多,毕竟这个代码比较多,比较繁琐。

以上就是小编为大家带来的完美解决单例设计模式中懒汉式线程安全的问题全部内容了,希望大家多多支持~


# 单例设计模式懒汉式  # 线程安全的单例模式的几种实现方法分享  # java多线程之线程安全的单例模式  # 都是  # 多线程  # 解决了  # 比较多  # 第一个  # 都要  # 不需要  # 中了  # 较低  # 只能用  # 如何解决  # 小编  # 大家多多  # 单线程  # 提高效率  # 是为了  # 情况下  # 提高了  # 但是在  # 在实际 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  在线制作视频网站免费,都有哪些好的动漫网站?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  iOS中将个别页面强制横屏其他页面竖屏  Laravel Session怎么存储_Laravel Session驱动配置详解  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  网站制作软件免费下载安装,有哪些免费下载的软件网站?  制作公司内部网站有哪些,内网如何建网站?  微信公众帐号开发教程之图文消息全攻略  Laravel如何创建自定义Artisan命令?(代码示例)  Angular 表单中正确绑定输入值以确保提交与验证正常工作  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  中山网站制作网页,中山新生登记系统登记流程?  教你用AI将一段旋律扩展成一首完整的曲子  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  南京网站制作费用,南京远驱官方网站?  Java遍历集合的三种方式  做企业网站制作流程,企业网站制作基本流程有哪些?  javascript基本数据类型及类型检测常用方法小结  Laravel如何处理异常和错误?(Handler示例)  Laravel如何实现API速率限制?(Rate Limiting教程)  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  动图在线制作网站有哪些,滑动动图图集怎么做?  详解jQuery停止动画——stop()方法的使用  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  独立制作一个网站多少钱,建立网站需要花多少钱?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  PHP正则匹配日期和时间(时间戳转换)的实例代码  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel如何优化应用性能?(缓存和优化命令)  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel如何实现用户密码重置功能?(完整流程代码)  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何在云指建站中生成FTP站点?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  微信推文制作网站有哪些,怎么做微信推文,急?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何快速打造个性化非模板自助建站?  JavaScript模板引擎Template.js使用详解