[Java、Android面试]_19_单例模式(高频问题)

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。
整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注+收藏

欢迎查看合集:
Java、Android面试高频系列文章合集

文章目录

    • 写一个单例模式
    • 为什么静态内部类可以实现线程安全且保证单例呢?

常见问题:

写一个单例模式

1.public class SingleInstance{
2.         public static instance = null;
3.         private SingleInstance(){};
4.         // 添加sychronized来进行线程安全
5.         public sychronized static SingleInstance getInstance(){
6.                    if(null == instance){
7.                             return new SingleIntance();
8.                    }
9.                    return instance;
10.         }
11.} 

此时的效率比较低,因为sychronized可能会使线程阻塞,那么可以利用静态内部类来实现:

1.public class Singleton {  
2.    private Singleton() {}    // 私有构造方法  
3.    // 静态内部类,用于延迟加载和创建单例实例  
4.    private static class SingletonHolder {  
5.        private static final Singleton INSTANCE = new Singleton();  
6.    }  
7.    // 公共静态方法,获取唯一实例  
8.    public static Singleton getInstance() {  
9.        return SingletonHolder.INSTANCE;  
10.    }  
11.}

为什么静态内部类可以实现线程安全且保证单例呢?

(1)延迟加载: 静态内部类不会在外部类加载时立即初始化,而是在首次访问内部类的静态成员(即 INSTANCE)时才会进行初始化。这就实现了懒加载,即只有在需要时才会创建单例实例。

(2)类加载机制: Java 类加载采用了类加载器加载类的方式,保证了类在首次访问时才会被加载。因此,静态内部类在外部类加载时并不会立即加载,只有在首次访问内部类的静态成员时才会触发类的加载和初始化。

(3)线程安全: 由于类加载和初始化在 JVM 中是线程安全的操作,所以静态内部类的初始化过程也是线程安全的。即使在多线程环境下,也可以保证只有一个线程会创建单例实例。

通过利用这些特性,静态内部类能够在需要时创建唯一的实例,同时保证了线程安全性,从而实现了单例模式。这种方式避免了加锁等复杂的同步机制,是一种非常高效且安全的实现方式。

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

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

相关文章

设计模式:解释器模式

定义 解释器模式(Interpreter Pattern)是一种行为型设计模式,它给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。简单来说,它主要用于某些特定…

Springboot的日常操作技巧

文章目录 1、自定义横幅2、容器刷新后触发方法自定义3、容器启动后触发方法自定义**CommandLineRunner**ApplicationRunner 不定时增加 参考文章 1、自定义横幅 简单就一点你需要把banner.text放到classpath 路径下 ,默认它会找叫做banner的文件,各种格式…

spring的bean创建流程源码解析

文章目录 IOC 和 DIBeanFactoryApplicationContext实现的接口1、BeanFactory接口2、MessageSource 国际化接口3、ResourcePatternResolver,资源解析接口4、EnvironmentCapable接口,用于获取环境变量,配置信息5、ApplicationEventPublisher 事…

使用扩展卡尔曼滤波器进行包裹测量的状态估计

此示例说明如何使用扩展卡尔曼滤波器算法对涉及圆形包裹角度测量的 3D 跟踪进行非线性状态估计。对于目标跟踪,传感器通常采用球形框架来报告物体的方位角、距离和仰角位置。该组的角度测量值在一定范围内报告。例如,报告的方位角范围为- 180∘ 到180∘或…

Leetcode55LeetCode45

题目 55. 跳跃游戏 思路 一看跳跃,自然想到动态规划。去看了题解发现可以将该问题进行转化,记录每个下标能达到的最远距离,要是这个最远距离超过了数组长度则说明能够到达终点。真的很巧妙!但是最开始自己写,想的是用…

UE5 GAS开发P34 游戏效果理论

GameplayEffects Attributes(属性)和Gameplay Tags(游戏标签)分别代表游戏中实体的特性和标识。 Attributes(属性):Attributes是用来表示游戏中实体的特性或属性的值,例如生命值、…

【网络通信】TCP三次握手、四次挥手

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP/IP协议族中,TCP协议负责在两个网络节点之间建立可靠的连接,并保证数据包的顺序传输和数据的完整性。 1.TCP三次握手 TCP三次握手(Thr…

【工具】录屏软件Captura安装使用及ffmpeg下载配置

开启技术视频创作,录屏软件林林总总,适合的、习惯的最好。 录屏软件Captura的使用及ffmpeg下载配置 1.Captura下载、安装2.FFmpeg下载、配置3.Captura屏幕录制试用、录制视频效果 1.Captura下载、安装 Captura主要是一个免费开源的录屏软件&#xff0c…

系统架构设计精华知识

数据流风格:适合于分阶段做数据处理,交互性差,包括:批处理序列、管理过滤器。调用/返回风格:一般系统都要用到,包括:主程序/子程序,面向对象,层次结构(分层越…

20240330-1-词嵌入模型w2v+tf-idf

Word2Vector 1.什么是词嵌入模型? 把词映射为实数域向量的技术也叫词嵌⼊ 2.介绍一下Word2Vec 谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构,分别是连续词袋&#xff…

54位大咖演讲精华! 中国生成式AI大会圆满收官,TOP50企业榜单揭晓

54位大咖演讲精华! 中国生成式AI大会圆满收官,TOP50企业榜单揭晓© 由 红板报 提供 智东西4月19日报道,为期两天的2024中国生成式AI大会,今日在京圆满收官。 54位产学研投嘉宾代表全程干货爆棚,报名咨询人数逾52…

操作符不存在:sde.st_geometry ^ !sde.st_geometry建议 SQL函 数st_intersects在内联inlining期间

操作符不存在:sde.st_geometry ^ !sde.st_geometry建议 SQL函 数st_intersects在内联inlining期间 问题:最近在使用SQL图形处理函数处理图形时,莫名奇妙报如下错误,甚是费解 于是开始四处"寻医问药" 1、nav…

G1、CMS垃圾回收期专题

共同点 非阻塞 使用三色标记法 初始标记、并发标记、重新标记、并发清理 (初始标记、重新标记需要stop world) CMS垃圾回收器 缺点 浮动垃圾 有垃圾碎片 关注停顿时间,使用了效率最高的标记清除算法 G1垃圾回收器 缺点 需要配置高&…

MySQL表级锁——技术深度+1

引言 本文是对MySQL表级锁的学习,MySQL一直停留在会用的阶段,需要弄清楚锁和事务的原理并DEBUG查看。 PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取,欢迎Star! MySQL表级锁 MySQL中表级锁主要有表锁…

【Java EE】 SpringBoot配置文件

文章目录 🍀配置文件的作用🌴SpringBoot配置文件🍃配置文件的格式🌳properties 配置文件说明🌸properties基本语法🌸读取配置文件🌸properties 缺点分析 🌲yml 配置文件说明&#x1…

Docker基本管理和虚拟化

一、docker的发展历史 https://www.cnblogs.com/rongba/articles/14782624.htmlhttps://www.cnblogs.com/rongba/articles/14782624.html 二、docker的概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行…

centos7 Nginx一键安装自动化脚本

离线环境下 centos7 Nginx一键安装自动化脚本 本文介绍了一个 Bash 脚本,可用于自动化安装 Nginx 服务器。该脚本简化了安装过程,省去了手动配置的繁琐步骤。 脚本功能特点: 依赖检查和安装: 自动检查并安装 Nginx 所需的依赖包…

轨迹跟踪控制导读

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、小车底盘运动学模型介绍二、路径跟踪方法:PID控制算法实现路径跟踪--飞思卡尔的方法三、路径跟踪方法&#x…

附近商户-GEO数据结构的基本用法

10、附近商户 10.1、附近商户-GEO数据结构的基本用法 GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有: GEOADD&#xff1a…

SpringBoot Bean管理(扫描、注册、注册条件)

Bean扫描 一般的扫描包路径 需要使用xml标签或者是ComponentScan(basePackages “xxx.xxx”) ,但是在SpringBoot中不需要。 在springBoot 项目的启动类中有一个注解:SpringBootApplication,这个注解包含以下注解: 但是ComponentScan并没有指明包路径…