设计模式2:单例模式

在这里插入图片描述

单例模式

单例模式属于创建型模式,⼀个单例类在任何情况下都只存在⼀个实例,
构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀
个静态公有⽅法获取实例。

双重检查锁(double check locking)

public class LazySingleton {
    //volatile防止指令重排序
    private static volatile LazySingleton instance;
    private LazySingleton() {}
    public static LazySingleton getInstance() {
        //第一次检查,确保不必要的同步
        if (instance == null) {
            synchronized (LazySingleton.class) {
                //第二次检查,确保只有一个线程创建实例
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }
}
  • 懒汉式,懒加载,使用的时候才创建对象

  • 双重检查指两次非空判断,锁指的synchronized加锁

    • 第一重判断,如果实例已经存在,无需进行同步操作
    • 第二重判断,有多个线程一起到达锁位置时,对锁竞争,其中一个线程获取锁后,第一次进入会判断实例为null,从而创建对象。完成后释放锁,其他线程获取锁后会被判定非空拦截,直接返回单例对象
  • synchronized同步代码块作用,防止有多个线程同时调用时,导致生成多个实例。有了同步块,每次只有1个线程能访问同步块内容。当第一个抢到锁线程创建实例后,之后的调用都不会进入同步块

  • volatile关键字作用:可见性、防止指令重排序。用new创建对象时,其实是三步操作,不是原子操作:

    • 1.在堆内存申请空间
    • 2.调用构造方法,初始化对象
    • 3.将引用变量指向堆内存空间

    为提高性能,处理器可能对代码执行顺序重新排序,如果运行顺序为1 3 2,当引用变量指向内存空间时,这个对象不为null,但是还没初始化,其他线程在调用getInstance方法使用时,会判断instance不为null,导致错误使用,出现异常

饿汉式

在类加载阶段就创建实例了

public class EagerSingleton {
    private final static EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {}

    public static EagerSingleton getInstance() {
        return instance;
    }
}
  • 线程安全,没加锁,效率高
  • 缺点是类加载就初始化,浪费内存空间

有关创建型设计模式的内容就更新到这了,下一篇更新结构型设计模式的内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/971278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 进程控制(进程创建,进程等待)

目录 进程创建 fork函数初识 fork函数返回值 写时拷贝 fork常规用法 fork调用失败的原因 进程终止 进程退出场景 进程退出码 进程常见退出方法 exit函数 _exit函数 return退出 return、exit和_exit之间的区别与联系 进程异常退出 进程等待 进程等待的必要性 获…

七星棋牌全开源修复版源码解析:6端兼容,200种玩法全面支持

本篇文章将详细讲解 七星棋牌修复版源码 的 技术架构、功能实现、二次开发思路、搭建教程 等内容,助您快速掌握该棋牌系统的开发技巧。 1. 七星棋牌源码概述 七星棋牌修复版源码是一款高度自由的 开源棋牌项目,该版本修复了原版中的多个 系统漏洞&#…

SuperMap GIS基础产品FAQ集锦(20250217)

一、SuperMap iServer 问题1:GPA算子是否有相关文档? 11.1.1 【解决办法】该功能算子可参考帮助文档:https://help.supermap.com/iServer/Server_Service_Management/Geoprocessing/GPFun/FunctionDescription/FunctionMD/GeoprocessingFunctionMD.z…

Vgg 改进:添加EMA注意力机制高效提升跨空间学习

目录 1. EMAAttention 模块 2. vgg 改进 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. EMAAttention 模块 EMA(Exponential Moving Average,指数移动平均)注意力机制是一种结合了指数移动平均和注意力机制的模型,旨在…

EasyExcel的简单使用

EasyExcel使用 官方文档&#xff1a;关于EasyExcel 1.1EasyExcel相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version></dependency> 1.2 写Excel 1.2.1 最…

亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用

文章目录 一、引言二、准备工作&#xff08;Ollama 工具介绍与下载&#xff09;2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…

反向代理模块kf

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

代码随想录D50-51 图论 Python

理论基础 理论基础部分依然沿用代码随想录教程中的介绍&#xff1a; 图的种类 度 连通性 连通性用于表示图中节点的连通情况。 如果有节点不能到达其他节点&#xff0c;则为非连通图&#xff0c;想象将多个水分子表示为图&#xff0c;不考虑非键作用&#xff0c;这张图就不是…

VScode运行后出现黑窗口

原文链接&#xff1a;VScode运行出黑窗口 1.安装插件&#xff1a;C/C Compile Run 2.快捷键【CtrlShiftp】,点击【首选项&#xff1a;打开用户设置】

【时时三省】(C语言基础)怎样表示一个算法

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 用自然语言表示算法 自然语言就是人们日常使用的汉语、英语或其他语言。用自然语言表示通俗易懂&#xff0c;但文字冗长&#xff0c;容易出现歧义。自然语言表示的含义往往不大严格&#xf…

PHP图书借阅小程序

&#x1f4da; 图书借阅小程序&#xff1a;一键开启智慧阅读新篇章 &#x1f31f; 这是一款由ThinkPHP与UniApp两大技术巨擘强强联手精心打造的图书借阅微信小程序&#xff0c;它犹如一座随身携带的移动图书馆&#xff0c;让您无论身处何地都能轻松畅游知识的海洋。创新的多书…

GPT-4o悄然升级:能力与个性双突破,AI竞技场再掀波澜

在大模型竞技场中&#xff0c;GPT-4o悄悄发布了全新版本&#xff0c;凭借其卓越的多项能力&#xff0c;迅速超越了DeepSeek-R1&#xff0c;成功登上并列第一的位置。这次更新不仅在数学&#xff08;第6名&#xff09;上有所突破&#xff0c;还在创意写作、编程、指令遵循、长文…

【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调

文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.3.1 zero-3微调2.2.3.2 zero-2微调2.2.3.3 单卡Lora微调 2.3 踩坑经验2.3.1 问题一&#xff1a;ValueError: Undefined dataset xxxx in dataset_info.json.2…

微信小程序之mobx-miniprogram状态管理

目前已经学习了6种小程序页面、组件间的数据通信方案,分别是: 1. 数据绑定: properties 2.获取组件实例: this.selectComponent() 3.事件绑定: this.triggerEvent() 4. 获取应用实例&#xff1a;getApp() 5. 页面间通信: EventChannel 6.事件总线:pubsub-js 在中小型项目…

express + vue 部署宝塔

域名备案 我这里是不同的账号&#xff0c;需要先登录服务器的账号生成授权码给到对应域名的账号。目前域名审核中。 进入域名账号&#xff0c;进行备案即可。 登录阿里云密码设置 未设置登录远程服务的密码&#xff0c;要先设置密码。 登录服务 设置安全组 根据宝塔的需要端…

250214-java类集框架

引言 类集框架本质上相当于是容器&#xff0c;容器装什么东西由程序员指定 1.单列集合 单列集合是list和set&#xff0c;list的实现类有ArrayList和LinkedList&#xff0c;前者是数组实现&#xff0c;后者是链表实现。list和set&#xff0c;前者有序、可重复&#xff0c;后者…

【华为OD机考】2024E+D卷真题【完全原创题解 详细考点分类 不断更新题目 六种主流语言Py+Java+Cpp+C+Js+Go】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 oj1441了解算法冲刺训练&#xff08;备注【CSDN】否则不通过&#xff09; 文章目录 相关推荐阅读模拟 数学排序字符串基础数组基础系统设计蒙特卡洛模拟其他 栈 常规栈单调栈 队列&#xff08;题目极少&#xff0c;几乎不…

【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界

目录 前言 一、Python—— 网络爬虫的绝佳拍档 二、网络爬虫基础&#xff1a;揭开神秘面纱 &#xff08;一&#xff09;工作原理&#xff1a;步步为营的数据狩猎 &#xff08;二&#xff09;分类&#xff1a;各显神通的爬虫家族 三、Python 网络爬虫核心库深度剖析 &…

借3D视觉定位东风,汽车零部件生产线实现无人化的精准飞跃

在新能源汽车市场的推动下&#xff0c;汽车零部件制造业正迎来前所未有的发展机遇。然而&#xff0c;传统的生产方式已经无法满足现代制造业对高效、精准的要求。为了应对这一挑战&#xff0c;越来越多的企业开始探索智能化生产的道路。 在这个过程中&#xff0c;3D视觉定位系…

Linux 服务器部署deepseek

把手教你在linux服务器部署deepseek&#xff0c;打造专属自己的数据库知识库 正文开始 第一步&#xff1a;安装Ollama 打开官方网址&#xff1a;https://ollama.com/download/linux 下载Ollama linux版本 复制命令到linux操作系统执行 [rootpostgresql ~]# curl -fsSL http…