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

再探单例模式

再探单例模式

  • 一:故事背景
  • 二:单例重点
  • 三:总结提升

一:故事背景

最近在进行单例模式的复习,今天进行一下对应的总结,分析一下各个设计模式。今天从最简单的单例模式开始。

二:单例重点

  1. 概念
    一个类有且仅有一个实例,并且向整个系统提供这个实例。
  2. 分类
    Java中有两种构建方式,分别是饿汉式和懒汉式。饿汉式的创建方式是私有的静态变量并且实例化,启动时就会创建。懒汉式有线程安全和线程不安全的两种。线程安全的可以通过加synchronized锁实现。
  3. 代码
    这里我们重点分析懒汉模式的代码。
public class Singleton {//1.私有的构造函数private Singleton(){}//静态变量,防止指令重排序,不然的话可能将对象引用复制给了变量,但是却没有调用构造方法。private  static volatile Singleton singleton = null;//对外提供访问点public static Singleton getSingleton(){//第一个if判断提高效率if(singleton == null){synchronized (Singleton.class){//获取锁后判断,避免产生多个实例对象if (singleton == null){//这不是一个原子操作,先执行 = 在执行 new Singleton();singleton = new Singleton();}}}return singleton;}}
  1. 重点
    上述代码重点是两个,第一个是,为什么双重检验。判断单例对象是否为null。第二个是为什么使用volatile 关键字,作用是什么
    第一个问题,第一层的if判断是为了提升效率,并发获取对象,不用去竞争锁。第二个是避免,多个线程同时走到了synchronized 代码块这里,倒是创建重复的对象。
    第二个问题的原因是通过使用volatile避免指令重排序。导致对象赋值给了singleton但是却没有执行构造函数,倒是出现错误。

三:总结提升

本文简单分析了单例模式,讲解了其中重点。

http://www.lryc.cn/news/227043.html

相关文章:

  • Postman使用json提取器和正则表达式实现接口的关联
  • 【11.10】现代密码学1——密码学发展史:密码学概述、安全服务、香农理论、现代密码学
  • 时间序列预测实战(九)PyTorch实现LSTM-ARIMA融合移动平均进行长期预测
  • 由日期计算当天是星期几
  • springboot模板引擎
  • 如何判断从本机上传到服务器的文件数据内容是一致的?用md5加密算法!
  • Ubuntu 20.04 DNS解析原理, 解决resolv.conf被覆盖问题
  • 探索经典算法:贪心、分治、动态规划等
  • 【Linux】编译Linux内核
  • 网页判断版本更新
  • ros1 基础学习08- 实现Server端自定义四 Topic模式控制海龟运动
  • 面试题之TCP粘包现象及其解决方法
  • Word 插入的 Visio 图片显示为{EMBED Visio.Drawing.11} 解决方案
  • Elasticsearch倒排索引、索引操作、映射管理
  • USEFUL PHRASES
  • 【OpenCV】 拟合直线 与 霍夫直线 对比 , fitLine()与 HoughLinesP()对比
  • Python与ArcGIS系列(六)查找和修复数据源
  • 聊聊logback的TimeBasedRollingPolicy
  • numpy 基础使用
  • sqlite3编译脚本
  • 环形链表解析(c语言)c语言版本!自我解析(看了必会)
  • 科技云报道:数智化升级,如何跨越数字世界与实体产业的鸿沟?
  • Rt-Thread 移植6--多线程(KF32)
  • HarmonyOS应用开发-首选项与后台通知管理
  • 通过easyexcel导出数据到excel表格
  • Android---MVP 中 presenter 声明周期的管理
  • Oracle中的索引碎片
  • Java必刷入门递归题×5(内附详细递归解析图)
  • android 闪屏图适配尺寸
  • 正则表达式中(?s)与(?m)的区别