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

单例模式设计

目标:

1. 饿汉模式

2. 懒汉模式

3. 饿汉模式优化

目录

饿汉模式 

懒汉模式

懒汉模式优化


饿汉模式 

由名字我们就可以知道 "饿汉" 嘛,就比较急切,在类加载的时候就创建实例

1. 写一个类,在本类中构造实例,用static修饰,直接创建出来(提供一个现有的实例)

2. 在本类中写一个方法获取到上面的实例

3. 将这个类的构造方法设置为私有的,让外部不能 new 这个对象

//饿汉模式:直接 static 一个实例(线程安全)//期望这个类只能有一个实例
public class Demo1 {//只构造一个实例private static Demo1 instance = new Demo1();//获取这个实例public static Demo1 getInstance() {return instance;}//把构造方法设置为私有 外部不能 new 这个类对象private Demo1(){}
}

懒汉模式

由名字我们就可以知道 "懒汉" 嘛,就比较从容~,它是等到有人调用的时候再创建实例

1. 写一个类,在本类中构造实例,用static修饰,赋值为空(等待有人调用)

2. 在本类中写一个方法获取到上面的实例

3. 将这个类的构造方法设置为私有的,让外部不能 new 这个对象

//懒汉模式://期望这个类只能有一个实例
public class Demo2 {private static Demo2 instance = null;//获取这个实例public static Demo2 getInstance() {if (instance == null) {instance = new Demo2();}return instance;}//把构造方法设置为私有 外部不能 new 这个类对象private Demo2(){}}

懒汉模式优化

根据上面的 "懒汉模式" 和 "饿汉模式"。我们可以知道,懒汉模式,它只是负责读取,没有修改。而 " 饿汉模式 " 是既读取,也进行修改。所以来说, "懒汉模式" 是线程安全的, "饿汉模式" 是线程不安全的。

所以为了使 " 饿汉模式" 线程安全,我们做以下几步操作:

1. 进行加锁:怎么加呢???

我们应该给整个 if 语句进行加锁,防止两个线程同时调用的时候都为 null ,从而就实例化了两个。

//懒汉模式优化
public class Demo3 {private static volatile Demo3 instance = null;//获取这个实例public static Demo3 getInstance() {synchronized (Demo3.class) {if (instance == null) {instance = new Demo3();}}return instance;}//把构造方法设置为私有 外部不能 new 这个类对象private Demo3(){}}

2. 线程安全是解决了,但是呢?

我们会发现,后续我们每次调用 getInstance() 的时候,都必须进行加锁一次,我们也没必要每次都加锁(加锁其实也是很大的开销,可能会使好多线程阻塞等待,影响了效率),当不为 null 的时候,就不用加锁了,这样就迎刃而解了~~~

//懒汉模式优化
public class Demo3 {private static volatile Demo3 instance = null;//获取这个实例public static Demo3 getInstance() {if (instance == null) {synchronized (Demo3.class) {if (instance == null) {instance = new Demo3();}}}return instance;}//把构造方法设置为私有 外部不能 new 这个类对象private Demo3(){}}

相关文章:

单例模式设计

目标: 1. 饿汉模式 2. 懒汉模式 3. 饿汉模式优化 目录 饿汉模式 懒汉模式 懒汉模式优化 饿汉模式 由名字我们就可以知道 "饿汉" 嘛,就比较急切,在类加载的时候就创建实例: 1. 写一个类,在本类中构造实…...

轻量型服务器能支撑多少人访问?

一、服务器配置影响访问人数 服务器的配置是影响轻量型服务器能够支撑的访问人数的关键因素之一。通常而言,轻量型服务器的配置普遍不高,适合小型团队或个人使用。如果服务器配置较低,那么支撑访问人数的能力也会受到限制。较为简单的应用程序…...

python: Sorting Algorithms

# encoding: utf-8 # 版权所有 2023 涂聚文有限公司 # 许可信息查看:Python Sorting Algorithms # 描述: * https://www.programiz.com/dsa/counting-sort # * https://www.geeksforgeeks.org/sorting-algorithms/ # Author : geovindu,Geovin Du 涂…...

Python 安装js环境

在终端执行下面的命令 npm install jsdom jsdom 是一个实现了 DOM API 的 JavaScript 环境,用于在 Node.js 中模拟浏览器的 DOM 环境。execjs 使用 jsdom 这个模块来执行 JavaScript 代码。所以在你的系统中,需要先安装并配置好 jsdom 模块&#xff0c…...

2023华为杯数模C题——大规模创新类竞赛评审方案研究

B题——大规模创新类竞赛评审方案研究 思路:采用数据分析等手段改进评分算法性能 完成情况(1-2问已经完成) 代码下载 问题一 在每个评审阶段,作品通常都是随机分发的,每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比…...

人工神经网络ANN:数学总结

一、内容 径向基函数(Radial basis function,RBF):一个取值仅依赖于到原点距离的实值函数,即。此外,也可以按到某一中心点c的距离来定义,即。 可以用于许多向函基数的和来逼近某一给定的函数&a…...

RabbitMQ的工作模式——WorkQueues

1.工作队列模式 生产者代码 public class Producer_WorkQueues1 {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.133&qu…...

AOJ 0531 坐标离散化

一、题目大意 在(0<x<w&#xff0c;0<y<h)的坐标系里有多个矩形&#xff0c;把区域分成了多个部分&#xff0c;我们需要针对找出被矩形分割的连通的区块数量。 二、解题思路 这个题目其实和学DFS时候那个找出连通的水洼是一样的。只是这个地图比较大&#xff0c…...

Python —— pytest框架

1、认识pytest框架 1、搭建自动化框架的思路与流程 1、搭建自动化测试框架的思路和流程&#xff0c;任意测试手段流程都是一致的&#xff1a;手工测试、自动化测试、工具测试 手工测试&#xff1a;熟悉业务 —— 写用例 —— 执行用例并记录结果 —— 生成测试报告自动化测试…...

IP地址欺骗的危害与后果

IP地址欺骗&#xff0c;也被称为IP地址伪装或IP地址欺诈&#xff0c;是一种网络攻击技术&#xff0c;旨在伪装或隐藏攻击者的真实IP地址。尽管这种技术可能有一些合法的用途&#xff0c;例如保护用户的隐私或绕过地理位置限制&#xff0c;但它也经常被恶意黑客用于不法行为。本…...

系统集成|第十章(笔记)

目录 第十章 质量管理10.1 项目质量管理概论10.2 主要过程10.2.1 规划质量管理10.2.2 实施质量保证10.2.3 质量控制 10.3 常见问题 上篇&#xff1a;第九章、成本管理 第十章 质量管理 10.1 项目质量管理概论 质量管理&#xff1a;指确定质量方针&#xff0c;质量目标和职责&a…...

Linux之perf(7)配置

Linux之perf(7)配置类命令 Author&#xff1a;Onceday Date&#xff1a;2023年9月23日 漫漫长路&#xff0c;才刚刚开始… 注&#xff1a;该文档内容采用了GPT4.0生成的回答&#xff0c;部分文本准确率可能存在问题。 参考文档: Tutorial - Perf Wiki (kernel.org)perf(1)…...

14:00面试,14:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

JPA的注解@Field指定为Keyword失败,导致查询不到数据

一、背景 使用 jpa 对es操作&#xff0c;查询条件不生效&#xff0c;需求是批量查询课程编号。说白了&#xff0c;就是一个In集合的查询。在es里&#xff0c;如果是精准匹配是termQuery&#xff0c;比如&#xff1a; queryBuilder.filter(QueryBuilders.termQuery(“schoolId…...

多线程带来的的风险-线程安全

多线程带来的的风险-线程安全 ~~ 多线程编程中,最难的地方,也是一个最重要的地方&#xff0c;还是一个最容易出错的地方,更是一个面试中特别爱考的地方.❤️❤️❤️ 线程安全的概念 万恶之源,罪魁祸首是多线程的抢占式执行,带来的随机性.~~&#x1f615;&#x1f615;&…...

Kafka 面试题

Kafka 面试题 Q:讲一下Kafka。 Kafka 入门一篇文章就够了 Kafka的简单理解 Q:消息队列&#xff0c;有哪些使用场景及用途&#xff1f; 解耦&#xff0c;削峰&#xff0c;限流。 Q:Kafka相对其他消息队列&#xff0c;有什么特点&#xff1f; 持久化&#xff1a;Kafka的持久化…...

离线部署 python 3.x 版本

文章目录 离线部署 python 3.x 版本1. 下载版本2. 上传到服务器3. 解压并安装4. 新建软连信息5. 注意事项 离线部署 python 3.x 版本 1. 下载版本 python 各版本下载地址 本次使用版本 Python-3.7.0a2.tgz # linux 可使用 wget 下载之后上传到所需服务器 wget https://www.py…...

Java 获取豆瓣电影TOP250

对于爬虫&#xff0c;Java并不是最擅长的&#xff0c;但是也可以实现&#xff0c;此次主要用到的包有hutool和jsoup。 hutool是一个Java工具包&#xff0c;它简化了Java的各种API操作&#xff0c;包括文件操作、类型转换、HTTP、日期处理、JSON处理、加密解密等。它的目标是使…...

笔试面试相关记录(5)

&#xff08;1&#xff09;不包含重复字符的最长子串的长度 #include <iostream> #include <string> #include <map>using namespace std;int getMaxLength(string& s) {int len s.size();map<char, int> mp;int max_len 0;int left 0;int i …...

四、C#—变量,表达式,运算符(2)

&#x1f33b;&#x1f33b; 目录 一、表达式1.1 什么是表达式1.2 表达式的基本组成 二、运算符2.1 算术运算符2.1.1 使用 / 运算符时的注意事项2.1.2 使用%运算符时的注意事项 2.2 赋值运算符2.2.1 简单赋值运算符2.2.2 复合赋值运算符 2.3 关系运算符2.4 逻辑运算符2.4.1 逻辑…...

Mojo与Python混合架构的成本可控性验证报告(内部绝密版):仅限前500名开发者获取的11项成本基线指标

第一章&#xff1a;Mojo与Python混合架构的成本可控性验证总览Mojo作为新兴的系统编程语言&#xff0c;专为AI原生开发设计&#xff0c;兼具Python语法亲和力与接近C的执行效率。在实际工程落地中&#xff0c;全量迁移至Mojo尚不现实&#xff0c;而采用Mojo与Python混合架构——…...

AI写论文秘籍!4款AI论文生成工具推荐,告别写论文的痛苦时刻!

你是否也在苦恼于期刊论文的撰写&#xff1f;面对海量的文献资料、繁琐的格式要求&#xff0c;以及不断的修改过程&#xff0c;让许多学术研究者感到效率低下&#xff0c;真的很困扰。不过别担心&#xff0c;下面推荐的四款AI论文写作工具可以帮助你轻松解决这些难题。从文献检…...

Windows下OpenClaw安装避坑:对接Qwen3-32B-Chat镜像详解

Windows下OpenClaw安装避坑&#xff1a;对接Qwen3-32B-Chat镜像详解 1. 为什么选择WindowsQwen3-32B-Chat组合 去年我在尝试自动化办公流程时&#xff0c;发现很多AI助手工具要么需要上传数据到云端&#xff0c;要么对硬件要求极高。直到遇到OpenClaw这个本地化AI智能体框架&…...

让 pgAdmin 和 PostgreSQL 运行在同一个 Docker 网络中。

明白了&#xff0c;您希望用 pgAdmin 来管理运行在 Docker 容器里的 PostgreSQL 数据库。最可靠且易于管理的方式是让 pgAdmin 和 PostgreSQL 运行在同一个 Docker 网络中。 下面给您一个最简洁的 Docker Compose 方案&#xff0c;您只需要复制保存、启动&#xff0c;就能通过浏…...

双目视觉实战:如何用OpenCV和Python实现简易3D建模(附完整代码)

双目视觉实战&#xff1a;如何用OpenCV和Python实现简易3D建模&#xff08;附完整代码&#xff09; 当你第一次看到3D电影中跃然眼前的画面&#xff0c;或是用手机扫描物体生成三维模型时&#xff0c;是否好奇过这背后的技术原理&#xff1f;双目视觉技术正是实现这些酷炫效果的…...

旋转变压器:从电磁耦合到高精度位置解算的工程实践

1. 旋转变压器&#xff1a;工业自动化的"角度翻译官" 第一次接触旋转变压器是在五年前的伺服电机调试现场&#xff0c;当时电机总是出现位置漂移&#xff0c;排查了半天才发现是旋变信号解算出了问题。这种看似简单的电磁元件&#xff0c;实则是工业自动化系统中不可…...

ESP32伺服与PWM控制库:硬件自适应资源管理

1. 项目概述ESP32ServoController 是一款专为 ESP32 系列微控制器设计的高性能 PWM 与伺服控制库。它并非对 Espressif 官方 LEDC&#xff08;LED Control&#xff09;外设驱动的简单封装&#xff0c;而是基于其硬件架构进行深度抽象与工程化重构的底层控制框架。该库的核心设计…...

如何用TranslucentTB打造终极Windows透明任务栏:新手完整指南

如何用TranslucentTB打造终极Windows透明任务栏&#xff1a;新手完整指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Wi…...

从体素到三维模型:解析Volumetric Method在复杂场景重建中的核心算法

1. 什么是Volumetric Method&#xff1f;从体素到三维世界的魔法 第一次接触三维重建时&#xff0c;我被那些从照片变成立体模型的演示惊呆了。后来才知道&#xff0c;这背后藏着一种叫Volumetric Method的技术&#xff0c;它就像用乐高积木搭建世界——把空间切成无数小方块&a…...

Golang实战gRPC与Protobuf:从入门到进阶

一、概述 1.1 gRPC是什么&#xff1f; gRPC是Google开源的高性能RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;基于HTTP/2协议传输&#xff0c;采用Protobuf作为数据序列化协议。其核心优势包括&#xff1a;高效序列化&#xff1a;Protobuf序列化后数据体积小、解析…...