【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

🍎个人博客:个人主页

🏆个人专栏:JAVA

⛳️  功不唐捐,玉汝于成


目录

前言

正文

懒汉式(Lazy Initialization):

双重检查锁定(Double-Checked Locking):

结语

我的其他博客


前言

在软件设计中,单例设计模式是一种重要的设计思想,它确保了一个类只有一个实例,并提供了一个全局访问点。在多线程环境下,实现线程安全的单例模式是必要的,以确保在并发操作中不会破坏单例的规则。

正文

单例设计模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。

在Java中实现线程安全的单例模式有多种方式,其中两种常见的方式是懒汉式和饿汉式。

  1. 懒汉式(Lazy Initialization):

    在懒汉式中,实例的创建是在第一次使用时进行的,以延迟初始化。

    public class LazySingleton {private static LazySingleton instance;private LazySingleton() {// 私有构造方法,防止外部直接实例化}public static synchronized LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
    }
    

    上述代码中,getInstance 方法使用了 synchronized 关键字,确保了多线程环境下的线程安全。但是,这样的实现会导致性能问题,因为每次调用 getInstance 时都要进行同步。

双重检查锁定(Double-Checked Locking):

双重检查锁定是在懒汉式的基础上进行改进,通过双重检查减小了同步块的范围,提高了性能。

public class DoubleCheckedLockingSingleton {private static volatile DoubleCheckedLockingSingleton instance;private DoubleCheckedLockingSingleton() {// 私有构造方法,防止外部直接实例化}public static DoubleCheckedLockingSingleton getInstance() {if (instance == null) {synchronized (DoubleCheckedLockingSingleton.class) {if (instance == null) {instance = new DoubleCheckedLockingSingleton();}}}return instance;}
}

 在上述代码中,使用了 volatile 关键字来保证 instance 的可见性,并且使用了双重检查来确保只在第一次调用 getInstance 时才进行同步。

这两种方式都是线程安全的单例模式实现,开发者可以根据具体的需求选择适合自己项目的方式。近年来,也推荐使用静态内部类方式实现单例,以及利用枚举类型实现单例,它们都是更为简洁和安全的实现方式。 

结语

在Java中,线程安全的单例模式有多种实现方式,懒汉式和双重检查锁定是其中的两种常见方式。选择适合自己项目的方式时,需要考虑性能、延迟初始化、代码简洁性等因素。近年来,也出现了更为简洁和安全的实现方式,如使用静态内部类或者枚举类型。无论选择哪种方式,理解单例模式的设计原理对于编写健壮、高效的代码至关重要。希望通过学习单例模式,你能够更好地应用它,提高代码的可维护性和性能。

我的其他博客

【JAVA】线程的run()和start()有什么区别?-CSDN博客

【日常聊聊】程序员必备的面试技巧:如何在面试战场上脱颖而出-CSDN博客

【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁-CSDN博客

【JAVA】怎么确保一个集合不能被修改-CSDN博客

【Web开发】会话管理与无 Cookie 环境下的实现策略-CSDN博客

【Mybatis】Mybatis如何防止sql注入-CSDN博客

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓-CSDN博客

【Spring】理解IoC与AOP:构建灵活而模块化的软件架构-CSDN博客

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

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

相关文章

C 练习实例26

题目&#xff1a;利用递归方法求5!。 程序分析&#xff1a; 使用递归要找到函数 f(n)与f(n-1)的关系&#xff0c;以及结束条件 此处的函数关系为&#xff1a;f(n) n*f(n-1)&#xff0c;f(n)为n的阶层 代码&#xff1a; #include <stdio.h> long double f(int n) {i…

MySQL篇—自带物理克隆数据工具Clone插件介绍(第一篇,总共三篇)

各位小伙伴&#xff0c;今天我为大家介绍一下MySQL Clone Plugin这个插件&#xff0c;简单来说&#xff0c;就是MySQL 8.0.17版本之后的一个物理克隆数据工具&#xff0c;它能够帮助我们快速、高效地克隆或复制数据库&#xff0c;极大地简化了数据库迁移、备份和恢复的过程&…

5分钟了解股票交易!上海股票开户交易佣金最低是多少?怎么开户费用最低?

股票交易是指通过证券市场买卖股票的活动。以下是股票交易的基本步骤&#xff1a; 开立证券账户&#xff1a;首先需要选择一家证券公司&#xff0c;向其提交相关材料开立证券账户&#xff0c;并完成账户开立手续。 研究和选择股票&#xff1a;在决定购买股票之前&#xff0c;建…

GPCR蛋白一般残基编号(Generic residue numbering)

文章目录 前言定义特殊情况参考连接 前言 在相应的文章中看到对于对于描述GPCR中的序列位置&#xff0c;往往在除了在当前蛋白的氨基酸序列序号意外&#xff0c;会在右上角标注一个类似于6 x 49的编号。经查这个编号有一个统一名称&#xff1a;Generic residue numbering。本文…

【AT 指令开发】软件框架与接口

目录 1 软件逻辑2.代码2.1 at_command.h2.2 at_command.c本文主要用于记录纯MCU无OS下,AT 指令开发软件框架 1 软件逻辑 2.代码 2.1 at_command.h #ifndef AT_COMMAND_H #define AT_COMMAND_Hvoid AT_CMD_Process(uint8_t *uartBuffer, uint8_t dataLen);/*描述AT指令返回值…

Kamailio使用自定义DNS条目

绕过DNS服务器&#xff0c;使用自定义DNS条目&#xff0c;有多种办法&#xff0c;这里仅提供其中一种&#xff1a; modparam("corex", "dns_cache", "typeA;namekamailio.org;addr192.168.1.100;ttl3600000;flags2") # 可以定义多次 其中&#x…

UIControl 功能和用法

UIControl 功能和用法 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们深入探讨iOS开发中常用的UI控件之一——“UIControl”&#xff0c;并详…

Springboot 中接口服务重试机制

在平时开发中可能在调用服务时会遇到调用失败的情况&#xff0c;在springboot 中retery 机制可以很好的满足我们的开发场景&#xff0c;下面举个简单的例子模拟第三方调用。 package com.szhome.web.action;import com.szhome.web.service.ThirdApiService; import org.spring…

Vue+element-china-area-data实现省市区三级联动

安装依赖 npm install element-china-area-data -S cnpm install element-china-area-data -S 引用 import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from element-china-area-data&#xff1b; provinceAnd…

Linux 命令解释程序(shell)的模拟实现

1.实验内容 分析、设计与实现基于 Linux 内核的命令解释程序&#xff08;Shell&#xff09;&#xff0c;主要包括系统环境变量的设置和初始化、系统命令提示符显示、命令辨别解析&#xff08;区分内部命令与外部命令及不同内部命令&#xff09;、典型内部命令&#xff08;譬如…

写点东西《Docker入门(上)》

写点东西《Docker入门&#xff08;上&#xff09;》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络&#xff1a; Docker 存储&#xff1a; Docker 是一个工具&#xff0c;允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…

【Redis】Redis 进阶

文章目录 1. BigKey1.1 MoreKey1.2 BigKey 2. 缓存双写一致性更新策略2.1 读缓存数据2.2 数据库和缓存一致性的更新策略2.3 canal 实现双写一致性 3. 进阶应用3.1 统计应用3.2 hyperloglog3.3 GEO3.4 bitmap 4. 布隆过滤器5. Redis 经典问题5.1 缓存预热5.2 缓存穿透5.3 缓存击…

Android Persistent自启机制

1.persistent属性的使用 在开发系统级的App时&#xff0c;很有可能就会用persistent属性。当在AndroidManifest.xml中将persistent属性设置为true时&#xff0c;那么该App就会具有如下两个特性&#xff1a; 在系统刚起来的时候&#xff0c;该App也会被启动起来 该App被强制杀…

华为完全自研之后,中国的手机会变得更便宜好用吗?

华为完全自研之后&#xff0c;中国的手机是否会变得更便宜好用&#xff0c;这是一个复杂的问题&#xff0c;涉及到多个因素。 首先&#xff0c;华为完全自研意味着公司需要自主研发和生产手机的所有组件&#xff0c;包括处理器、摄像头、屏幕等。这将有助于降低成本&#xff0c…

antd时间选择器,设置显示中文

需求 在实现react&#xff0c;里面引入antd时间选择器&#xff0c;默认显示为英文 思路 入口处使用ConfigProvider全局化配置&#xff0c;设置 locale 属性为中文来实现。官方文档介绍全局化配置 ConfigProvider - Ant Design 代码 import React from react; import { Prov…

道可云元宇宙每日资讯|浙江印发《加快人工智能能产业发展的指导意见》

道可云元宇宙每日简报&#xff08;2024年1月12日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 浙江印发《加快人工智能能产业发展的指导意见》 近日&#xff0c;浙江省人民政府办公厅印发《加快人工智能能产业发展的指导意见》。 《意见》指出&#xff0c;到 …

(Arcgis)matlab编程批量处理hdf5格式转换为tif格式

国家青藏高原科学数据中心 全球逐日0.05时空连续地表温度数据集&#xff08;2002-2022&#xff09; 此代码仅用于该数据集处理 版本&#xff1a;arcgis10.2 matlab2020 参考&#xff1a;MATLAB hdf(h5)文件转成tif图片格式&#xff08;批量处理&#xff09; 一、遇到问题 h5…

MidTool的AIGC与NFT的结合-艺术创作和版权保护的革新

在数字艺术和区块链技术的交汇点上&#xff0c;NFT&#xff08;非同质化代币&#xff09;正以其独特的方式重塑艺术品的收藏与交易。将MidTool&#xff08;https://www.aimidtool.com/&#xff09;的AIGC&#xff08;人工智能生成内容&#xff09;创作的图片转为NFT&#xff0c…

GEE数据集——2000 年至 2022 年与传感器无关的 MODIS 和 VIIRS LAI/FPAR CDR

2000 年至 2022 年与传感器无关的 MODIS 和 VIIRS LAI/FPAR CDR 该地理空间数据集包含关键的生物物理参数&#xff0c;即叶面积指数&#xff08;LAI&#xff09;和光合有效辐射分量&#xff08;FPAR&#xff09;&#xff0c;是描述陆地生态系统特征不可或缺的参数。该数据集解…

uniapp自定义封装只有时分秒的组件,时分秒范围选择

说实话&#xff0c;uniapp和uview的关于只有时分秒的组件实在是不行。全是日历&#xff0c;但是实际根本就不需要日历这玩意。百度了下&#xff0c;终于看到了一个只有时分秒的组件。原地址&#xff1a;原地址&#xff0c;如若侵犯请联系我删除 <template><view clas…