[JAVAEE] 多线程的案例(一)-单例模式

目录

一. 单例模式

二. 单例模式的使用时机

三. 单例模式的关键代码

四. 单例模式的几种实现方式

4.1 饿汉方式(急)

4.2 懒汉模式(缓)

a. 解决原子性的问题 

b. 解决程序运行效率低下的问题

c. 解决指令重排序的问题(其次是为了解决内存可见性的问题) 

五. 总结


一. 单例模式

单例模式是一种设计模式, 表示单个实例(对象), 强制要求一个类中只能有一个实例


二. 单例模式的使用时机

需要控制实例数量, 节省系统资源时使用.


三. 单例模式的关键代码

构造方法必须是私有化的(private), 为了保证这个类只有一个实例.

示例(饿汉模式): 


四. 单例模式的几种实现方式

4.1 饿汉方式(急)

饿汉方式是线程安全的, 因为只涉及到赋值操作, 不涉及到修改操作.

4.2 懒汉模式(缓)

此种方式下, 懒汉模式是线程不安全的.

a. 解决原子性的问题 

最容易观察到的, 上述代码存在原子性的问题, 因为在 getSingletonLazy方法中涉及到了修改操作, 此时需要加锁解决. 

b. 解决程序运行效率低下的问题

两个线程同时启动, 一个线程获取了锁, 进行if判断之后实例化了SingletonLazy对象, 再然后解锁了. 此时另一个线程获取锁, 进行了if判断, 但是并没有实例化对象, 再然后解锁.

此时两个线程, 获取了两次锁, 会使程序的效率降低.

这时就需要两次if判断, 来提高程序的运行效率.

c. 解决指令重排序的问题(其次是为了解决内存可见性的问题) 


五. 总结

1. 单例模式就是单个实例对象, 强制要求一个类中只能存在一个实例对象. 

2. 单例模式的使用时机是: 需要控制实例数量, 节约内存资源.

3. 单例模式的关键代码: 私有化构造方法(保证一个类中只能存在一个实例对象).

4. 单例模式的几种实现方法: 饿汉模式(线程安全), 懒汉模式(现成不安全 => 解决: 双重if外加锁, 需要明白各个操作的含义).

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

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

相关文章

HCIP-HarmonyOS Application Developer 习题(十七)

(判断)1、对于用户创建的一些临时卡片在遇到卡片服务框架死亡重启,此时临时卡片数据在卡片管理服务中已经删除,且对应的卡片ID不会通知到提供方,所以卡片使用方需要自己负责清理长时间未刚除的临时卡片数据。 答案&…

QT:MaintenanceTool 模块安装工具

QT的MaintenanceTool 工具对已安装的 Qt 进行卸载、修复等其他操作时提示At least one valid and enabled repository required for this action to succeed 解决方式:在设置中添加一个临时的仓库 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepositor…

C++算法练习-day18——15.三数之和

题目来源:. - 力扣(LeetCode) 题目思路分析 题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a b c 0 ?找出所有独特三元组…

Threejs 实现3D 地图(05)3d 地图进场动画和地图边缘动画

3d 地图进场特效以及地图边缘动画 代码仓库: King/threejs-3d-map 地图边缘动画核心代码: const initBorderPoint () > {// 获取地图边界的左边(通过https://datav.aliyun.com/portal/school/atlas/area_generator#2.51/104.299012/33…

常用 SQL 语句的大全

常用 SQL 语句的大全,涵盖了基本的查询、更新、删除以及数据库管理等操作,适用于不同的数据库系统(如 MySQL、PostgreSQL、SQL Server 等)。 1. 数据库操作 创建数据库 CREATE DATABASE database_name;删除数据库 DROP DATABAS…

6,000 个网站上的假 WordPress 插件提示用户安装恶意软件

黑客使用窃取的凭证感染 WordPress 网站,并向其发送虚假插件,通过虚假的浏览器更新提示向最终用户发送恶意软件和信息窃取程序。 该恶意活动基于ClickFix假浏览器更新恶意软件的新变种,自 2024 年 6 月以来已使用假 WordPress 插件感染了超过…

放大器和基本运放电路的公式推导

放大器和基本运放电路的公式推导 放大器全家谱运放的渊源和数学分析基本运放电路的公式推导预备知识基本特性跟随器特性比较器特性 基本运放电路反相放大器(反比例运算放大器)同相放大器(正比例运算放大器)反相加法器同相加法器减…

Python条形图 | 指标(特征)重要性图的绘制

在数据科学和机器学习的工作流程中,特征选择是一个关键步骤。通过评估每个特征对模型预测能力的影响,我们可以选择最有意义的特征(指标),从而提高模型的性能并减少过拟合。本文将介绍如何使用 Python 的 Seaborn 和 Ma…

Android 12.0进程保活白名单功能实现

在Android 12.0系统中,实现进程保活白名单功能是为了确保某些重要的应用程序即使进入后台也能长时间保持运行状态,不被系统自动杀死。这一功能的实现涉及多个核心类和文件,以下是具体的实现步骤和核心功能分析: 一、实现步骤 …

PG数据库之索引详解

PostgreSQL数据库中的索引是一种用于提高查询性能的重要数据结构。通过索引,数据库可以快速定位到表中的特定行,而无需进行全表扫描。PostgreSQL支持多种索引类型,每种类型都有其特定的应用场景和性能特点。下面将详细介绍PostgreSQL中的索引…

go 使用fyne实现桌面程序的计算器例子

使用Fyne工具包构建跨平台应用是非常简单的,在此之前我们需要做一些准备功能做,比如安装一些gcc基础图形依赖库,还有go语言本身的运行开发环境都是必要的。 在此之前我们希望你是go语言的已入门用户,掌握go的协程,管道…

鲁班猫的一些踩坑

有坑的地方 1、安装relasense: 错误:不要采用下面的二进制安装(在主机、Jetson可以使用),尽管也能安装并运行realsense-viwer,但是链接不到相机设备! sudo apt-key adv --keyserver keyserver…

Linux基础知识 - C(自学使用)

1.C语言基础知识 参考博客: https://blog.csdn.net/qq_45254369/article/details/126023482?ops_request_misc%257B%2522request%255Fid%2522%253A%252277629891-A0F3-4EFC-B1AC-410093596085%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%…

Xcode文件默认存储位置-使用c++file保存文件默认路径以及设置为路径为当前项目路径

Xcode文件默认存储位置-使用cfile保存文件默认路径以及设置为路径为当前项目路径 1.概述 使用Xcode工具开发时候,遇到C调用file创建文件后,在当前项目中找不到文件路径。这是由于xcode会将文件保存到默认设置的路径。下面是查看文件默认存储路径和修改…

DC-9靶场渗透

靶机:DC-9 DC: 9 ~ VulnHub 攻击机:kail linux 2024 1,将两台虚拟机网络连接都改为NAT模式,并查看DC-9的MAC地址 2,进行主机扫描,通过MAC地址发现靶机的IP地址 攻击机IP地址192.168.23.169,靶机IP地址192.1…

MySQL-存储过程/函数/触发器

文章目录 什么是存储过程存储过程的优缺点存储过程的基本使用存储过程的创建存储过程的调用存储过程的删除存储过程的查看delimiter命令 MySQL中的变量系统变量用户变量局部变量参数 if语句case语句while循环repeat循环loop循环游标cursor捕获异常并处理存储函数触发器触发器概…

QT QGestureEvent支持平移,缩放,旋转触摸板手势

一.Gesture释义 平移:点按住触控板,然后拖移,实现平移功能。 缩放:在触控板上,双指张开实现放大,双指合拢实现缩小。 旋转:在触控板上,双指分别反方向移动旋转,实现旋转功能。 二.实现功能 1.重写bool event(QEvent *event) override事件: bool ImageWidget::event…

16. 虚拟化

文章目录 第16章 虚拟化16.1 共享资源16.2 虚拟机16.3 虚拟机镜像16.4 容器16.5 容器和虚拟机16.6 容器的可移植性16.7 Pod(容器组)16.8 无服务器架构16.9 小结16.10 扩展阅读16.11 问题讨论 第16章 虚拟化 “虚拟”意味着永远不知道你的下一个字节从哪里…

SpringBoot poi-tl通过模板占位符生成word文件

简介: 开发中我们需要通过在word中使用占位符来动态渲染一些数据,本文讲解poi-tl实现动态生成word文档,包括表格循环,对象嵌套。 poi-tl官网文档 Poi-tl Documentation 1. word格式 这是我的test.word 这是导出后的out.docx文件 …

蓝桥杯普及题

[蓝桥杯 2024 省 B] 好数 题目描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。 给定一个正整数 N N N,请计算从 1 1