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

devtools/2024/10/21 19:53:14/

目录

一. 单例模式

二. 单例模式的使用时机

三. 单例模式的关键代码

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

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.ppmy.cn/devtools/127641.html

相关文章

.net framework 3.5sp1安装错误卡住不动怎么解决

解决 .NET Framework 3.5 SP1 安装错误卡住的问题,可以尝试以下几种方法: 1.使用 DISM 工具: 将下载的 NetFx3.cab 文件放置在 C:\Windows 文件夹下。 以管理员身份打开命令提示符,输入以下命令: dism /online /En…

Python知识点:基于Python工具,如何使用Brownie进行智能合约测试

开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 如何使用Brownie进行智能合约测试 在以太坊智能合约开发中,测试是至…

java01作业说明:

1. 功能概述 该BMI计算器应用程序的主要功能是: 输入身高和体重:用户可以输入其身高(以米为单位)和体重(以千克为单位)。计算BMI:根据用户输入的身高和体重计算BMI值。健康反馈:根…

Element Ui el-table列表中的tooltip内容过长超出屏幕换行显示

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示内容,虽然el-table列属性中带的有show-overflow-tooltip,可以设置内容超出列宽度显示为…,且有tooltip提示全部内容,但是内容过多时,提示会超出屏幕: 只有…

Android Studio 编译报错整理

Android Studio 编译报错整理 Build Type ‘debug‘ contains custom BuildConfig fields, but the feature is disabled. buildFeatures{buildConfig true}

【rCore OS 开源操作系统】Rust 宏

前置知识点 各种宏 宏定义: 使用 macro_rules! 关键词来定义宏,这是一种模式匹配式的宏定义方式。 自 Rust 1.26 版本开始,可以使用 proc_macro 属性宏来定义过程宏(如 derive 宏)。 宏的使用: 宏可以通过…

SICK系列激光雷达单点测距仪DT80-311111+SIG200配置和通信

文章目录 一、硬件连接与SOPAS连接测距仪二、从SOPAS读取数据三、通过JSON获取数据1. 使用Postman测试接口2. 通过代码实现 一、硬件连接与SOPAS连接测距仪 首先硬件设备连接如下: 电源厂家应该是不提供,需要自行解决。 安装完成后需要使用sick的SOPAS…

Java爬虫:获取商品销量详情API返回值的实战指南

在数字化时代,数据已成为电商运营的核心。商品销量数据不仅反映了市场的需求和趋势,还能为商家提供决策支持。通过Java爬虫技术,我们可以高效地获取这些数据,从而深入分析商品的市场表现。 为何选择Java爬虫获取销量数据 自动化处…