设计模式:解决一些固定场景的固定套路,是一种代码风格的知道指南。设计模式不止23种

1、单例设计模式

单例设计模式:确保一个类只有一个实例,提供全局访问点

单例模式的实现方式:

1:饿汉模式

/*** 饿汉模式*/
class SingletonPattern {private static SingletonPattern instance = new SingletonPattern();private SingletonPattern () {// 设置为private,外部类就不能通过new创建实例}public static SingletonPattern getInstance() {return instance;}
}public class SinglePattern {public static void main(String[] args) {SingletonPattern instance1 = SingletonPattern.getInstance();SingletonPattern instance2 = SingletonPattern.getInstance();System.out.println(instance1 == instance2); // true}
}

2:懒汉模式

懒汉模式(线程不安全)

此处的代码是存在线程安全问题的。

1:原子性

应该将此处代码打包成原子的,不让代码穿插操作。所以就对代码进行加锁,解决原子性问题

if(instance == null) {
            instance = new SingleLazy();
        }

2:指令重排序

instance = new SingleLazy(); 此处这个new操作实际有好几步指令,粗略分为下面三步

1:内存分配

2:初始化零值

3:执行构造函数

实际的执行顺序是1-》2-》3,但是编译器优化的指令重排序,可能会将原本执行顺序重排为1-》3-》2,所以为了避免指令重排序,需要在instance上加上volatile

class SingleLazy {/*** 单例模式* 懒汉模式:创建实例的时机比较晚,不是那么急迫*/private static SingleLazy instance = null;private SingleLazy() {}// 第一次使用实例的时候,才创建实例public static SingleLazy getInstance() {if(instance == null) {// return new SingleLazy(); // 这样写是错的,这样每次get都会newinstance = new SingleLazy();}return instance;} 
}
public class SingleLazyPattern {public static void main(String[] args) {SingleLazy instance1 = SingleLazy.getInstance();SingleLazy instance2 = SingleLazy.getInstance();System.out.println(instance1 == instance2); // true}
}

 懒汉模式(线程安全)

又在锁的外面加了一条判断,目的就是只在第一次调用getInstance方法是进行加锁,避免重复加锁

if(instance == null) 
// 如果不进行判断,那么每次调用getInstance方法都会进行加锁操作
// 但是如果加了判断,只会在第一次调用getInstance方法进行加锁操作
 

class SinglePattern {private static volatile SinglePattern instance = null; // volatile解决指令重排序问题private static Object lock = new Object();private SinglePattern() {// 避免外部创建实例}public static SinglePattern getInstance() {if(instance == null) {// 如果不进行判断,那么每次调用getInstance方法都会进行加锁操作// 但是如果加了判断,只会在第一次调用getInstance方法进行加锁操作synchronized(lock) { // 加锁,解决原子性问题if(instance == null) {instance = new SinglePattern();}}}return instance;}
}public class SingleLazyPattern {public static void main(String[] args) {SinglePattern instance1 = SinglePattern.getInstance();SinglePattern instance2 = SinglePattern.getInstance();System.out.println(instance1 == instance2);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909842.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909842.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909842.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx代理缓存静态资源

问题描述 有两台服务器,一台是外网的网关服务器,一台是内网的资源服务器,但是两台服务器距离很远(跨省),页面中依赖大量插件资源,加载耗时久,本章重点讲解Nginx代理缓存静态资源。 …

Blender 转换为 STP:软件操作与迪威模型网在线转换全指南

在三维设计与工程制造领域,不同格式的文件承担着各自的使命。Blender 作为一款功能强大且开源的三维建模软件,被众多设计师、艺术家以及学生广泛使用,能够创作出风格多样、细节丰富的三维模型。而 STP 格式作为制造业通用的数据交换标准&…

WebFuture:PDF页面去掉下载按钮

问题描述:客户要求pdf页面不显示下载按钮 解决办法:WF15.2版本开始会在内容管理配置增加“允许下载 PDF“开关;之前的版本需要替换文件来处理 1.备份网站下的base文件夹,路径为/wwwroot/content/_common/base/,然后覆…

【JVM】- 类加载与字节码结构2

编译期处理(语法糖) java编译器把.java源码编译成.class字节码的过程,自动生成和转换的一些代码。 默认构造器 public class Candy01 { }编译成class后的代码 public class Candy1 {public Candy1(){super();} }自动拆装箱(jd…

WSL2 中安装 cuDNN​​ 的完整指南

以下是关于 ​​cuDNN​​ 的详细介绍及在 ​​WSL2 中安装 cuDNN​​ 的完整指南,结合权威资料整理而成: 📚 ​​一、cuDNN 深度解析​​ ​​1. 定义与作用​​ ​​cuDNN​​(CUDA Deep Neural Network Library)是…

Apache Doris FE 问题排查与故障分析全景指南

前言: FE(Frontend)是 Apache Doris 集群架构中的“大脑”,负责元数据管理、查询解析和调度等关键任务。一旦 FE 出现问题,整个集群的稳定性和可用性将受到严重影响。因此,掌握 FE 故障定位与排查方法对于保…

RK AndroidFramework 内置应用可,卸载,恢复出厂设置恢复安装

device/rockchip/rk356x/rk3568_r/preinstall_del/Android.mkdevice/rockchip/rk356x/rk3568_r/preinstall_del/Android.mk include $(call all-subdir-makefiles) 拿内置LoyversePos应用做例子 device/rockchip/rk356x/rk3568_r/preinstall_del/preinstall.mk PRODUCT_PACK…

一文了解Blob文件格式,前端必备技能之一

文章目录 前言一、什么是Blob?二、Blob的基本特性三、Blob的构造函数四、常见使用场景1. 文件下载2. 图片预览3. 大文件分片上传 四、Blob与其他API的关系1. File API2. FileReader3. URL.createObjectURL()4. Response 五、性能与内存管理六、实际案例:…

LLMs 系列实操科普(4)

六、deep research 这是 chatgpt 推出的功能,但我这里是免费用户,一个月才有 5 次使用机会,而且使用的是轻量化模型版本,相对体验上比较鸡肋一些。 那这个深度思考研究是个什么东西呢? 根据 openai 对其的解释是&…

若依框架前端调用后台服务报跨域错误

背景:使用若依框架的前后端分离项目,前后端开发在同一个办公室情况下前端调用后端服务提示如下报错:Access to XMLHttpRequest at http://ip1:8089/online/layer/dataType from origin http://ip2:6090 has been blocked by CORS policy: Res…

PHP商城源码:构建高效电商平台的利器

一、PHP商城源码的核心优势 1. **开源免费,降低成本** PHP作为开源语言,拥有庞大的开发者社区,成熟的商城源码(如EcShop、OpenCart)可免费获取,大幅降低企业的技术投入成本。 2. **开发效率高** PHP语法…

【学习笔记】C++代码规范整理

【学习笔记】C代码规范整理 一、匿名空间namespace 匿名命名空间(Anonymous Namespace)是一种特殊的命名空间声明方式,其作用是将声明的成员限定在当前编译单元(源文件)内可见,类似于使用 static 关键字修…

数学复习笔记 29 不定积分

前言 复习的时候时常复习一下以前复习的高数,温故而知新,可以为师矣。现实生活中有非常多让我难受的事情,贤者模式的时候也会对一些自己的行为嗤之以鼻,复习考研对其他三门科目都没有学出来正反馈,只能从数学这儿找一…

微软因安全漏洞禁用黑暗环境下的Windows Hello面部识别功能

面部识别技术在各种场景中的应用日益广泛,但身份欺诈事件仍时有发生,这表明即使面部识别也并非万无一失。在某些情况下,这些系统可能被攻击者利用。 漏洞发现与应对措施 近期,微软在Windows 10和11系统中禁用了黑暗环境下使用Wi…

产品经理课程(十五)实战点评(3)

(一)复习 需求文档是产品的说明书 需求文档包含:修订记录、背景、主要流程、详细功能逻辑、数据上报,发布策略 bug也是需求文档的一部分 (二)案例讲解 案例一: 一个版本里面的4-5个功能点就比…

大模型量化与剪枝

大模型量化,剪枝 量化有助于减少显存使用并加速推理 GPTQ 等后训练量化方法(Post Training Quantization)是一种在训练后对预训练模型进行量化的方法。 ### model model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct template: llama3### export export_di…

Oracle 数据库数据操作:精通 INSERT, UPDATE, DELETE

作者:IvanCodes 日期:2025年6月18日 专栏:Oracle教程 在 Oracle 数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言 (DML - Data Manipulation Language) 来完成的。核心的DML语句包括 INSERT (插入新数据), UPDATE…

推荐使用的Unity插件(InputSystem)

本文将提供更简洁的步骤和常见问题解决。 一、极简入门步骤: 安装:Package Manager中安装Input System(确保Unity版本在2019.4) 创建Input Actions: 在Project窗口右键 -> Create -> Input Actions 双击打开…

清理 Docker 容器日志文件方法

操作总结与问题解析 一、操作目的与背景 用户旨在清理 Docker 容器日志文件以释放服务器存储空间,主要通过以下命令组合完成操作: 查看容器日志空间占用清空指定容器的日志文件验证容器运行状态与日志清理效果二、关键命令与输出解析 1. 查看 Docker 容器日志空间占用 du…

图片压缩工具 | 按指定高度垂直切割图片

OPEN-IMAGE-TINY,一个基于 Electron VUE3 的图片压缩工具,项目开源地址:https://github.com/0604hx/open-image-tiny ℹ️ 需求描述 在上一篇文章一段代码利用 snapdom 将 CSDN 博文转化为长图片(PNG/JPG/PDF)中&…