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

单例模式 JAVA

单例模式

什么是单例模式?

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

应用:数据库的连接类,这样就可以确保只创建一次。节省资源。

单例模式代码:涉及懒加载、双重检查锁、volatile防止指令重排。

懒加载:在调用方法的时候才初始化对象。对应的是饿汉模式:private static Singleton singleton=new Singleton();

双检锁: 第一个是指synchronized(Singleton.class){…} 之所以将锁加在这里而不是方法上是因为加在方法上的话,多个线程调用这个方法都要抢锁,而实际上我们只需要保证创建对象时线程安全即可。所以为了更细粒度的锁我们加在了判空前。

第二个是指锁内还写了一个判空条件。这是因为线程A和B都进入了第一个判空条件内,然后这时候A加了锁,开始创建创建对象。结束后B线程也会创建对象。所以就需要再加一个判空条件。

volatile: singleton=new Singleton();其实分为三步:1.给Singleton分配空间。2.初始化对象(调用Singleton的构造方法)3.将singleton这个引用指向刚分配的内存地址。

但如果指令重排按照1,3,2的顺序进行。如果2还没有执行完,这时再来一个线程B发现singleton不为空了,直接return singleton,而我们的构造方法还没执行呢!这时就会出错。

class SingletonLazy {// 使用private防止其他类使用// 使用双重检查锁 必须加上volatile 防止指令重排private volatile static SingletonLazy singletonLazy;// 私有化构造器private SingletonLazy() {};public  static SingletonLazy getInstance() {// 双重检查锁if (singletonLazy == null) {synchronized (SingletonLazy.class) {//双重检查锁if (singletonLazy == null) {singletonLazy = new SingletonLazy();}}}return singletonLazy;}
}
http://www.lryc.cn/news/333125.html

相关文章:

  • C++从入门到精通——初步认识面向对象及类的引入
  • GitHub入门与实践
  • centos 安装 stable-diffusion 详细流程
  • CSS编写登录框样式
  • Python|OpenCV-获取鼠标点击位置的坐标,并绘制图像(13)
  • 设计模式(14):命令模式
  • 关于阿里云云数据库自动扩缩容和自动SQL优化的20道面试题
  • mkcert生成ssl证书+nginx部署局域网内的https服务访问问题
  • PTA C 1050 螺旋矩阵(思路与优化)
  • 神经网络分类和回归任务实战
  • 【数据结构】考研真题攻克与重点知识点剖析 - 第 4 篇:串
  • 深入浅出 -- 系统架构之分布式多形态的存储型集群
  • STL —— list
  • 申请SSL证书
  • 深入浅出 -- 系统架构之负载均衡Nginx环境搭建
  • notepad++绿色版添加右键菜单
  • 7 个 iMessage 恢复应用程序/软件可轻松恢复文本
  • DockerFile启动jar程序
  • 基于R、Python的Copula变量相关性分析及AI大模型应用
  • 鸿蒙组件学习_Tabs组件
  • 【LangChain学习之旅】—(19)BabyAGI:根据气候变化自动制定鲜花存储策略
  • thinkphp6入门(21)-- 如何删除图片、文件
  • 虚拟内存知识详解
  • 数据结构初阶:顺序表和链表
  • 在flutter中添加video_player【视频播放插件】
  • golang微服务框架特性分析及选型
  • 苹果cmsV10 MXProV4.5自适应PC手机影视站主题模板苹果cms模板mxone pro
  • GPU的了解
  • 鸿蒙实战开发-如何使用Stage模型卡片
  • 蓝桥杯刷题 前缀和与差分-[2128]重新排序(C++)