当前位置: 首页 > java >正文

设计模式之单例模式

单例模式属于创建型模式,主要用于解决频繁创建和销毁全局使用的类实例的问题。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

按照实例化时机可分为 饿汉式懒汉式 两种

饿汉式

在类加载的时候实例化对象

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

懒汉式

第一次需要用到的时候实例化对象,有两种写法

第一种:给 getInstance 方法加锁,代码编写简单,但是效率不高

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

第二种:使用双检锁,现实中使用较多

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

这里给instance变量加上volatile关键字是为了防止代码重排序
instance = new Singleton(); 这一行代码可拆解为 3 步

  1. 分配内存
  2. 初始化对象
  3. 指向刚分配的地址

如果发生了代码重排序,可能流程变成 1 -> 3 -> 2
这样可能出现一种情况
线程 A 按照 1 -> 3 -> 2的流程执行,先让instance指向了一个地址
此时线程 B 进入这个方法,直接获取了 instance,但此时instance 尚未初始化
所以我们利用 volatile 关键字防止代码重排序。

http://www.xdnf.cn/news/9469.html

相关文章:

  • MySQL MVCC(多版本并发控制)详解
  • 使用 Frida 增强 FART:实现更强大的 Android 脱壳能力
  • 逛网站看到个场景题,如何防止重复下单
  • react diff 算法
  • Uniapp+UView+Uni-star打包小程序极简方案
  • 【Fifty Project - D32】
  • 工业5.0视域下的医疗AI行业未来发展方向研究
  • TCXO温度补偿振荡器的概述和补偿方法
  • WES(二)——数据预处理
  • 前端使用 spark-md5 实现大文件切片上传
  • 68元开发板,开启智能硬件新篇章——明远智睿SSD2351深度解析
  • 黑马程序员C++核心编程笔记--3 函数高级
  • 技术视界 | 打造“有脑有身”的机器人:ABC大脑架构深度解析(下)
  • android-studio-2024.3.2.14如何用WIFI连接到手机(给数据线说 拜拜!)
  • git push Git远端意外挂断
  • 代码随想录算法训练营第60期第五十天打卡
  • LVS的DR模式部署
  • C++23:std::print和std::println格式化输出新体验
  • 沉浸式 VR 汽车之旅:汽车虚拟展厅与震撼试驾体验
  • Python编程8——面向对象编程3
  • 前端面经 React 组件常见的声明方式
  • 从零开始搞个简易分布式部署环境
  • 封装一个小程序选择器(可多选、单选、搜索)
  • 使用 Syncfusion 在 .NET 8 中生成 PDF/DOC/XLS/PPT
  • IPMI SOL (Serial over LAN) 排错与配置手册
  • DNS解析过程以及使用的协议名称
  • Redis击穿,穿透和雪崩详解以及解决方案
  • 睡眠分期 html
  • ArcGIS Pro裁剪影像
  • 4.8.4 利用Spark SQL实现分组排行榜