java程序员面试必备:Java 设计模式之单例模式

面试必备:《Java 最常见 200+ 面试题全解析》 毕业在即,想让面试官在短短的几十分钟内就认可你的能力? 想在最快的时间内收获 Java 技术栈最核心的知识点? 想要更全面、更深入的了解 Java 技术? 这里能够给你想要的所有答案 阅读详情

有些时候,我们想要一个类在整个系统中仅存在一个实例。比如说,系统给我们提供了一个打印机硬件设施,但是我们在系统中多次new 打印机,创建出多个打印机的实例去完成打印任务,那么这个时候就会出现资源冲突现象,这就要求我们必须想一个办法,去确保系统中存在唯一的一个打印机实例,解决方法有很多种,比如

创建一个全局变量

这样创建一个全局变量,并且规定想要使用打印机服务,必须使用mPrinter 这个实例去完成,不得再去创建新的打印机实例,这种方法是可以解决这个问题的。但是这种方法是有缺陷的,比如,一些不遵守规则的人或者说不明白规则的人又创建了一个Printer实例,还是会引起冲突,这就出现了单例模式。

单例模式

单例模式UML

如图示,如若我们将单例模式的构造方法设置成private,也就是私有的,只提供给一个获得实例的接口,并且在getInstance 方法中做些特殊处理,就可以保证系统中存在唯一实例,下面介绍几种单例模式的实现方法。

经典实现方法(懒汉式)

通过这种定义方法,就可以保证系统中仅存在唯一实例,是吗?

小编是一个有着5年工作经验的java程序员,对于java,自己有做资料的整合,一个完整学习java的路线,学习资料和工具,相信这里有很多学习java的小伙伴,我创立了一个2000人学习扣群,479121291。每晚都有java的直播课程。无论是初级还是进阶的小伙伴小编我都欢迎!

一般情况下,这种方式是不会存在问题的,但是因为多线程,导致这种方法是不可靠的。举例来说,如果系统中存在两个子线程,同时进入 getInstance() 函数,当一个线程刚刚通过if判断语句,还未来得及 new 出一个实例,线程切换,另一个线程也通过了if判断语句,那么这个时候就会new出两个实例,还是无法保证在多线程条件下的单一性,所以我们需要在getInstance() 函数前加入 synchronized 关键字。

synchronized 处理,可以保证同一时刻,只有一个线程可以进入getInstance() 函数,但是如果我们需要多次调用getInstance() 函数时,这种方法是非常消耗资源的。当然,如果我们只是很少次使用这个函数,那么这种方法是完全满足需求的。那么针对多次使用的情况,我们只能使用下一种方式了。

饿汉式

这种方法我们直接在定义的时候就 new 出了一个实例,无论调用getInstance() 多少次,我们也只会返回固定的一个实例,也就不存在多线程同步的问题了。

但是,如果我们从头到位并没有用到 Printer ,而我们却草率的 new 出了一个实例,这样会占用内存资源,所以我们还要用到下一种方法。

双重检查锁定

当一个线程通过第一个if判断语句时,无论怎样,在同一时刻,只有一个线程可以进入第二个if判断语句,而且会new 出一个实例,保证synchronized方法从始至终只会执行一次,这样就解决了饿汉式和懒汉式的尴尬,因为它既不会像懒汉式那样多次进入synchronized方法占用系统资源,也不会像饿汉式那样在不使用的情况下占用系统资源。

一种更好的实现方法

事实上还存在一种能够将饿汉式和懒汉式的缺点全部克服而且能将二者的优点合二为一的方法,那就是 Initialization on Demand Holder(IoDH)方法。

因为静态的单例对象没有作为类的成员变量直接实例化,因此在Printer类加载时并没有实例化mPrinter。第一次调用newInstance() 的时候加载内部类CreatePrinter ,该内部类定义了一个static 类型的变量mPrinter,此时会首先初始化这个变量,由JVM 来保证其线程安全性,确保该成员变量只被实例化一次。

可见,通过使用这个方法,不仅实现了延迟加载,又可以保证线程安全,不影响系统性能。

面试必备:《Java 最常见 200+ 面试题全面解析》 春招在即,想让面试官在短短的几十分钟内就认可你的能力? 想在最快的时间内收获 Java 技术栈最核心的知识点? 想要更全面、更深入的了解 Java 技术? 这里能够给你想要的所有答案 阅读详情

相关推荐

MLC-LLM框架在安卓设备上的模型编译与部署全流程解析

本文详细解析了如何利用MLC-LLM框架在安卓设备上编译与部署大语言模型。从环境搭建、模型获取与量化编译,到最终的安卓应用打包与调试,提供了完整的实战流程。重点介绍了如何通过MLC-LLM将大型模型优化为适合移动端运行的格式,实现本地、低延迟、隐私安全的AI应用部署。

weixin_29251337的博客 475

单例模式详解

一、什么是单例模式 单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建者模式,它提供了一种访问对象的最佳方式。 这种设计模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象。 二、单例模式的结构 单例类:只能创建一个实例的类 访问类:使用单例类的类 三、单例模式分类 饿汉式:类加载就会导致该单实例对象被创建 懒汉式:类加载不会导致该单实例对象被创...

欢迎一起学习交流 2万+

跟着团子学SAP CO:揭秘结果分析码在项目结算中的实战应用(一)KKA2/CJ88

本文深入解析了SAP CO模块中结果分析码在项目结算中的核心作用。以KKA2(方法10)和事务代码CJ88为例,详细阐述了如何在项目完工后一次性确认收入的场景下,通过结果分析功能实现收入与成本的精准匹配,将项目成本暂估为在制品,确保各期利润的准确反映。

gamma的博客 685

JAVA设计模式之单例模式详解

1.1 定义单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,此模式保证某个类在运行期间,只有一个实例对外提供服务,而这个类被称为单例类。单例模式也比较好理解,比如一个人一生当中只能有一个真实的身份证号,一个国家只有一个政府,类似的场景都是属于单例模式。1.2 使用单例模式要做的两件事保证一个类只有一个实例为该实例提供一个全局访问节点1.3 单例模式结构1 ) 单例的定义单例设计模式保证某个类在运行期间,只有一个实例对外提供服务,而这个类被称为单例类。

励志成为一名优秀的全能型软件开发工程师。 4491

【QGIS】PyCharm集成pyqgis的processing工具箱:环境配置与初始化实战

本文详细介绍了如何在PyCharm中配置QGIS的Python环境并成功集成其强大的Processing工具箱。文章核心解决了独立环境下导入processing模块失败、算法无法调用等常见难题,通过手动添加插件路径和执行关键初始化步骤,实现了在PyCharm中丝滑调用QGIS地理处理算法,从而将复杂的空间分析流程自动化。

weixin_28831399的博客 391

车底盘:阿克曼转向和四轮差速

特性四轮差速四轮转向阿克曼转向转向方式控制左右轮组速度差控制四个轮子的角度控制前轮角度(后轮固定)运动原理滑移摩擦(搓着走)纯滚动(滚着走)近乎纯滚动(低速时)能耗高低(实现纯滚动时)中轮胎磨损非常严重小中灵活性高(可原地旋转)极高(可全向移动)低(转弯半径大)控制精度较低(受地面摩擦影响大)极高高机械复杂度低(通常只需2个驱动电机)极高(需4个转向+4个驱动执行器)中(需1个转向+2个驱动执行器)典型应用坦克、履带车辆、简单AGV、扫地机器人豪华轿车、高性能全向AGV。

bing_feilong的博客 1926

实现单例模式的八种方法

一.单例模式的定义: 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例 二.单例模式的特点  1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。  3、单例类必须给所有其他对象提供这一实例。   三.线程安全问题: 一方面在获取单例的时候,要保证不能产生多个实例对象,后面会详细讲到五种实现方式; 另一方面,在使用单例对象的时候,要注意单例对象内的实例变量是...

weixin_45522644的博客 1704

基于Spring Security 6的OAuth2 系列之二 - 客户端--非代码演示授权码模式

至此,我们就使用浏览器+postman工具演示了通过授权码模式去获取Gitee的用户信息。这过程中,我们只是遵循OAuth2的流程,就能够实现授权方法。那么接下来,我们采用代码方式来实现这个流程。

代码让AI扣 1813

java单例模式详解

java几种单例模式:1、通过静态内部类实现2、饿汉式3、懒汉式

喵酱 1797

Unity-Mirror网络框架-从入门到精通之MultipleMatches示例

Multiple Matches 示例主要讲述了如何在使用 Mirror 网路框架时管理多个游戏匹配。以及如何设置一个能够同时支持多个游戏会话的系统,使玩家能够加入他们所选择的比赛,而不是强制他们加入一个单一的匹配。

TxNet 964

YOLOv11 知识蒸馏完整实战:Teacher–Student 训练策略与性能飞跃

在self.alpha = alpha # 蒸馏损失权重self.temperature = temperature # 温度系数,控制分布平滑度# 输出分布蒸馏(KL散度损失)# 中间特征蒸馏(MSE损失,对齐中间层特征)# 总蒸馏损失知识蒸馏是YOLOv11在“小模型高性能部署”场景的“破局之法”——它让小模型能“站在大模型的肩膀上”,兼具速度与精度。从损失函数定义到多阶段训练,再到实战落地,本教程已为你铺就了一条清晰的路径。

m0_64661770的博客 141

【单例模式】java设计模式之——单例模式(通俗易懂!!最强详解)

单例模式是一种常见的设计模式,用于确保某个类只有一个实例,并提供全局访问点以供其他对象使用。在Java中,单例模式的实现方式主要有懒汉式单例、饿汉式单例和登记式单例。是指在首次使用时才创建实例。其特点是延迟加载,即在需要的时候才创建对象。懒汉式单例的写法通常采用双重检查锁定来保证线程安全。是指在类加载时就创建实例。其特点是立即加载,即在类加载时就生成对象。饿汉式单例的写法简单直接,但无法实现延迟加载。是指将所有实例都存放在一个注册表中,通过标识符来获取对应的实例。

miles067的博客 1734

基于STM32+华为云设计的智能鱼缸

本项目基于STM32单片机设计一款基于物联网的智能鱼缸系统,并通过应用侧接口开发上位机APP实现远程对鱼缸参数的检测和控制。该系统包括水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能,可以帮助用户更好地管理鱼缸,提高鱼儿的生存率,同时增强用户对家庭装饰品的掌控感和科技感。

1万+

2020年 Java 最常见200+ 面试题全解析:面试必备

序言 在本篇文章开始之前,我想先来回答一个问题:我为什么要写这样一篇关于面试的文章?原因有三个: 第一,我想为每一个为梦想时刻准备着的“有心人”,尽一份自己的力量,提供一份高度精华的 Java 面试清单; 第二,目前市面上的面试题不是答案不准确就是内容覆盖面太窄,所以提供一份经典而又准确的面试题是非常有必要的; 第三,本文会对部分面试题提供详细解读和代码案例,让读者知其然并知其所以然,从而学到更多...

精◈彩◈猿◈笔◈记 7043

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

10年Java面试总结:Java程序员面试必备的面试技巧

作为一名Java程序员,面试是你职业生涯中不可或缺的一部分。一个成功的面试不仅能展现你的技术能力,更能展示你的思维过程、问题解决能力和与人合作的态度。通过这些18个技巧的运用,你可以在面试中更好地展示自己,从而获得心仪的工作机会。记住,持续学习和不断实践是提升自己的关键。祝你面试成功!本文已收录于,我的技术网站ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享。

架构师专栏 2397

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Java程序员必备的面试技巧与高频面试题,内有面经

本文是根据我的面试百场总结的一些建议和技巧,帮助你更好地准备Java技术面试。

小明的Java问道之路 4549

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

程序员必备的面试技巧

面试技巧

升仔聊编程的博客 1422

《Java面试通关手册》已经很全面很详细了,程序员必备。

滴滴篇………并发编程多线程集合框架设计模式数据库性能优化RabbitMQ消息中间件ActiveMQ消息中间件DubboJVMKafkaMongoDBMyBatisMySQLNettyNginxRedisTomcatZookeeperSpringSpringBootSpringMVC…….程序员必备书单=======程序员简历模板温馨提示:Java通过手册的领取地址,在公告上联系我下载。

2401_84048521的博客 951

一个JAVA中级程序员的面试准备

JAVA面试准备: 文章目录JAVA面试准备:1,JAVA——SE基本数据类型:字符串:面向对象:集合:多线程设计模式相关算法:面试题之:某某与某某有什么区别2,JAVA——EESPRINGSPRINGMVCMYBATISSPRINGBOOTSPRINTCLOUDDOUBBOZOOKEEPER3,MYSQL NOSQLMYSQLREDISMongDB4,前端 js5,LINUX 环境,GIT,S...

sinat_32568213的博客 5449

Java 程序员面试必备!助你剑指 Offer

你想满载 Offer 而归吗?你想得到更高的薪资吗?你想跳到更大的平台吗?你想瞬间吸引 HR 的目光吗?本场 Chat,我将分享自己的面试经验,让你掌握面试秘诀,想即所得。 通过本场 Chat 你将收获到的知识: Java 程序员如何准备简历,吸引 HR; Java 基础的常见面试题及解析; JVM 常见面试题及解析; Spring、SpringMVC、MyBaties、Struts、Hiber...

GitChat 1933

Java程序员必备的网盘资源 大集合

备注:网盘资源,后续会持续更新… 疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 + 涨薪必备 疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备 疯狂创客圈 价值1000元 百度网盘资源大礼包,随便取 【博客园总入口 】 价值连城:2021春招月薪过5万 面试题 系列 搞定下面这些面试题,2021春招月薪过5万(猛!) 阿里、京东、美团、头

架构师尼恩 5610

程序员秋招面试必备Java面试题及答案!

shardingSphere相关。springSecurity相关。Spring WebFlux相关。ElasticSearch相关。MyBatisPlus相关。SpringCloud相关。SpringMVc源码相关。领域驱动设计(DDD)相关。任务调度Airflow相关。Java企业架构体系相关。网络IO与Netty相关。Kubernetes相关。postgresql相关。skywalking相关。SpringBoot相关。MapReduce面试题。zookeeper相关。亿级流量多级缓存相关。

IT_1024的博客 1688

Java程序员就业必备,1000道面试题总结!

基本数据类型,如int,float,double,boolean,char,byte,不具备对象的特征,不能调用方法。装箱:将基本类型转换成包装类对象拆箱:将包装类对象转换成基本类型的值java为什么要引入自动装箱和拆箱的功能?主要是用于java集合中,List<Inteter> list=new ArrayList<Integer>();list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱成对象。

2401_89221867的博客 1087

设计模式之单例模式:说明与应用

Java八股是程序员面试和进阶的必备技能。本专栏旨在每篇文章通过一个八股问题深入钻研,并引申出其相关联的知识点,方便记忆。本文介绍设计模式的单例模式。将围绕单例模式的概念、实现、应用三个方面展开叙述。

AkimotoManatsu的博客 1501
上一篇: JAVA面向对象的总结
下一篇: Java面向对象中的成员内部类
java03_15
博客等级 码龄9年 263粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值