Java面试之单例模式的六种实现方式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、为什么要用单例模式
- 二、单例模式的六种实现
- 2.1 饿汉式
- 2.1.1 饿汉式代码实现
- 2.1.2 饿汉式代码实现要点解析
- 2.1.3 饿汉式代码实现优点
- 2.1.4 饿汉式代码实现缺点
- 2.2 懒汉式1.0
- 2.2.1 懒汉式1.0代码实现
- 2.2.2 懒汉式1.0代码实现要点解析
- 2.2.3 懒汉式1.0代码实现优点
- 2.2.4 懒汉式1.0代码实现缺点
- 2.3 懒汉式2.0
- 2.3.1 懒汉式2.0代码实现
- 2.3.2 懒汉式2.0代码实现要点解析
- 2.3.3 懒汉式2.0代码实现优点
- 2.3.4 懒汉式2.0代码实现缺点
- 2.4 懒汉式3.0——双重检查Double Check
- 2.4.1 双重检查代码实现
- 2.4.2 双重检查代码实现要点解析
- 2.4.3 双重检查代码实现优点
- 2.4.4 双重检查代码实现缺点
- 2.5 静态内部类(推荐)
- 2.5.1 静态内部类代码实现
- 2.5.2 静态内部类代码实现要点解析
- 2.5.3 静态内部类代码实现优点
- 2.5.4 静态内部类代码实现缺点
- 2.5.5 静态内部类与饿汉式对比
- 2.6 枚举(推荐)
- 2.6.1 枚举代码实现
- 2.6.2 枚举代码实现要点解析
- 2.6.3 枚举实现优点
前言
由于设计模式在面向对象中起着举足轻重的作用,在面试中很多公司都喜欢问一下有关设计模式的问题。在常用的设计模式中,Singleton单例模式是唯一一个能用短短几十行代码完整实现的模式,因此,写一个Singletion类型是一个很常见的面试题。
一、为什么要用单例模式
节省内存,单例对象可避免频繁的创建与销毁,带来性能的提升。
在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。
二、单例模式的六种实现
2.1 饿汉式
2.1.1 饿汉式代码实现
public class Singleton{private Singleton(){}private static Singleton instance = new Singleton();public static Singleton getInstance(){return instance;}
}
2.1.2 饿汉式代码实现要点解析
1、私有构造
2、创建私有静态实例
3、提供公有静态get方法返回该静态实例
2.1.3 饿汉式代码实现优点
1、实现简单
2、无线程安全问题
2.1.4 饿汉式代码实现缺点
1、初始化耗时,导致系统启动缓慢
2、在类装载的时候就完成了实例化,没有做到Lazy Loading(延迟加载)、按需加载
3、极端情况下,还是可以拿到多实例,如通过反射。
2.2 懒汉式1.0
2.2.1 懒汉式1.0代码实现
public class Singleton{private Singleton(){}private static Singleton instance = null;public static Singleton getInstance(){if(instance == null){instance = new Singleton();}return instance;}
}
2.2.2 懒汉式1.0代码实现要点解析
1、私有构造
2、初始化一个为null的静态实例instance
3、提供公有静态get方法,判断instance为null时,则创建该对象并赋给instance,然后返回该静态实例
2.2.3 懒汉式1.0代码实现优点
1、延迟加载,在使用时才会开辟空间
2.2.4 懒汉式1.0代码实现缺点
1、线程不安全,只能在单线程情况下使用,在多线程情况下,一个线程进if(instance == null)判断中,还未来得及创建对象,另外一个线程也来到判断语句,这时也会通过判断,这样就会创建多个实例。
总的来说在多线程环境中不能使用这种方式。
2.3 懒汉式2.0
2.3.1 懒汉式2.0代码实现
public class Singleton{private Singleton(){}private static Singleton instance = null;public static synchronized Singleton getInstance(){if(instance == null){instance = new Singleton();}return instance;}
}
2.3.2 懒汉式2.0代码实现要点解析
1、私有构造
2、创建私有静态实例
3、提供加synchronized的公有静态get方法返回该静态实例
2.3.3 懒汉式2.0代码实现优点
1、用的时候开辟内存
2、解决线程安全问题
2.3.4 懒汉式2.0代码实现缺点
1、效率太低。下一个线程想要获取对象,必须等待上一个线程释放锁之后才能获取。每次调用都需要获取锁与释放锁,在大量并发请求时将产生性能问题。
2、并发度低。由于加入了synchronized,并行度为1,导致并发度低。
3、极端情况下,还是可以拿到多实例,如通过反射。
2.4 懒汉式3.0——双重检查Double Check
2.4.1 双重检查代码实现
public class Singleton{private Singleton(){}private static Singleton instance = null;public static synchronized Singleton getInstance(){if(instance == null){//这个检查是提高效率的synchronized (Singleton.class){if(instance == null){//这个检查是保证线程安全的instance = new Singleton();}}}return instance;}
}
2.4.2 双重检查代码实现要点解析
1、私有构造
2、创建私有静态实例
3、提供加synchronized的公有静态get方法返回该静态实例,该get方法中首先判断instance是否为null,然后加个synchronized块,里面再对instance进行判断,为空才创建对象
2.4.3 双重检查代码实现优点
1、实现简单
2、立即加载,无线程安全问题
2.4.4 双重检查代码实现缺点
极端情况下,还是可以拿到多实例,如通过反射。
2.5 静态内部类(推荐)
2.5.1 静态内部类代码实现
public class Singleton{private Singleton(){}private static Singleton SingletonInstance {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance(){return SingletonInstance.INSTANCE;}
}
2.5.2 静态内部类代码实现要点解析
1、私有构造
2、创建私有静态内部类,该静态内部类中含有static 和final修饰的实例对象
3、提供公有静态get方法返回该静态实例
2.5.3 静态内部类代码实现优点
1、延迟加载,效率高
2、无线程安全问题。类的静态属性只会在第一次加载类时初始化,这样JVM帮助我们保证了线程安全性,因为在类初始化时别的线程无法进入。
2.5.4 静态内部类代码实现缺点
静态内部类虽然保证了单例在多线程并发下的线程安全性,但是在遇到序列化对象时,默认的方式运行得到的结果就是多例的。
极端情况下,还是可以拿到多实例,如通过反射。
2.5.5 静态内部类与饿汉式对比
此方法可以看作饿汉式的改进版,两者都采用类装载机制来保证初始化实例时只有一个线程。
不同之处在于饿汉式只要Singleton类被装载就会实例化,没有延迟加载;
而静态内部类方式再Singleton类被装载时并不会立即实例化,而是在需要实例化时才会调用getInstance方法装载SingletonInstance 类,从而完成Singleton实例化。
总的来说推荐使用。
2.6 枚举(推荐)
2.6.1 枚举代码实现
public class Singleton{//内部类使用枚举类private enum SingletonEnum {INSTANCE;private Singleton singleton;//在枚举类的构造器里初始化singletonSingletonEnum() {singleton = new Singleton ();}private Singleton getSingleton() {return singleton;}}//对外提供获取单例的方法public static Singleton getInstance(){return SingletonEnum.INSTANCE.getSingleton();}
}
2.6.2 枚举代码实现要点解析
1、内部类使用枚举类
2、在枚举类的构造器里初始化singleton,提供私有方法供本类获取singleton
3、对外提供获取单例的方法
2.6.3 枚举实现优点
1、支持延迟加载,可做到按需加载
2、支持高并发
3、防止反射和反序列化攻击
总的来说推荐使用。
相关文章:
Java面试之单例模式的六种实现方式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、为什么要用单例模式二、单例模式的六种实现2.1 饿汉式2.1.1 饿汉式代码实现2.1.2 饿汉式代码实现要点解析2.1.3 饿汉式代码实现优点2.1.4 饿汉式代码实现缺…...
re正则入门
🌸re正则入门 正则表达式 (Regular Expression) 又称 RegEx, 是用来匹配字符的一种工具. 在一大串字符中寻找你需要的内容. 它常被用在很多方面, 比如网页爬虫, 文稿整理, 数据筛选等等 简单的匹配 正则表达式无非就是在做这么一回事. 在文字中找到特定的内容, 比如…...
C++ Day5
目录 一、静态成员 1.1 概念 1.2 格式 1.3 银行账户实例 二、类的继承 2.1 目的 2.2 概念 2.3 格式 2.4 继承方式 2.5 继承中的特殊成员函数 2.5.1 构造函数 2.5.2析构函数 2.5.3 拷贝构造函数 2.5.4拷贝赋值函数 总结: 三、多继承 3.1 概念 3.2 格…...
el-element:自定义参数
希望在下拉框、输入框、多选框中添加自定义参数,这在项目中是非常常见的 1、 Select选择器中remote-method方法带自定义参数 :remote-method"(query)>{remoteMethod(query,自定义参数)}" remoteMethod(query, pid){ } 2、 el多选框方法追加参数&…...
“分布式”与“集群”初学者的技术总结
一、“分布式”与“集群”的解释: 分布式:把一个囊肿的系统分成无数个单独可运行的功能模块 集群: 把相同的项目复制进行多次部署(可以是一台服务器多次部署,例如使用8080部署一个,8081部署一个,…...
C++day5(静态成员、类的继承、多继承)
一、Xmind整理: 二、上课笔记整理: 1.静态数据成员静态成员函数(银行账户实例) #include <iostream>using namespace std;class BankAccount { private:double balance; //余额static double interest_rate; //利率 p…...
2023MySQL+MyBatis知识点整理
文章目录 主键 外键 的区别?什么是范式?什么是反范式?什么是事务?MySQL事务隔离级别?MySQL事务默认提交模式?MySQL中int(1)和int(10)的区别MySQL 浮点数会丢失精度吗?MySQL支持哪几种时间类型&a…...
【随笔】如何使用阿里云的OSS保存基础的服务器环境
使用阿里云OSS创建一个存储仓库:bucket 在Linux上下载并安装阿里云的ossutil工具 // 命令行,是linux环境 3. 安装ossutil。sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash 说明:安装过程中,需要使用解压工具…...
汽车电子笔记之:AUTOSA架构下的多核OS操作系统
目录 1、AUTOSAR多核操作系统 1.1、OS Application 1.2、多核OS的软件分区 1.3、任务调度 1.4、核间任务同步 1.5、计数器、报警器、调度表 1.6、自旋锁与共享资源 1.7、核间通信IOC 1.8、OS Object中元素交互 1.9、多核OS的启动与关闭 2、多核OS注意事项 2.1、最小…...
解决华为云ping不通的问题
进入华为云控制台。依次选择:云服务器->点击服务器id->安全组->更改安全组->添加入方向规则,添加一个安全组规则(ICMP),详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP协…...
数据结构入门 — 链表详解_双向链表
前言 数据结构入门 — 双向链表详解* 博客主页链接:https://blog.csdn.net/m0_74014525 关注博主,后期持续更新系列文章 文章末尾有源码 *****感谢观看,希望对你有所帮助***** 系列文章 第一篇:数据结构入门 — 链表详解_单链表…...
时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)
时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比) 目录 时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)预测效果基本介绍模型介绍程序设计参…...
SSL/TLS协议的概念、工作原理、作用以及注意事项
个人主页:insist--个人主页 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、SSL/TLS协议的基本概念 二、SSL/TLS的工作…...
[Stable Diffusion教程] 第一课 原理解析+配置需求+应用安装+基本步骤
第一课 原理解析配置需求应用安装基本步骤 本次内容记录来源于B站的一个视频 以下是自己安装过程中整理的问题及解决方法: 问题:stable-diffusion-webui启动No Python at ‘C:\xxx\xxx\python.exe‘ 解答:打开webui.bat 把 if not de…...
uniapp结合Canvas+renderjs根据经纬度绘制轨迹(二)
uniapp结合Canvasrenderjs根据经纬度绘制轨迹 文章目录 uniapp结合Canvasrenderjs根据经纬度绘制轨迹效果图templaterenderjsjs数据结构 根据官方建议要想在 app-vue 流畅使用 Canvas 动画,需要使用 renderjs 技术,把操作canvas的js逻辑放到视图层运…...
VR全景加盟会遇到哪些问题?全景平台会提供什么?
想创业,你是否也遇到这些问题呢?我是外行怎么办?没有团队怎么办?项目回本周期快吗?项目靠谱吗?加盟平台可信吗?等等这类疑问。近几年,VR产业发展迅速,尤其是VR全景项目在…...
如何进行微服务的集成测试
集成测试的概念 说到集成测试,相信每个测试工程师并不陌生,它不是一个崭新的概念,通过维基百科定义可以知道它在传统软件测试中的含义。 Integration testing (sometimes called integration and testing, abbreviated I&T) is the pha…...
spark grpc 在master运行报错 exitcode13 User did not initialize spark context
程序使用sparksql 以及protobuf grpc ,执行报错 ApplicationMaster: Final app status: FAILED, exitCode: 13, (reason: Uncaught exception: java.lang.IllegalStateException: User did not initialize spark context! 先说原因 : 1.使用了不具备权限…...
nginx 反向代理的原理
Nginx(发音为"engine X")是一个高性能、轻量级的开源Web服务器和反向代理服务器。它的反向代理功能允许将客户端的请求转发到后端服务器,然后将后端服务器的响应返回给客户端。下面是Nginx反向代理的工作原理: 1.客户端…...
【SpringBoot】第二篇:RocketMq使用
背景: 本文会介绍多种案例,教大家如何使用rocketmq。 一般rocketmq使用在微服务项目中,属于分模块使用。这里使用springboot单体项目来模拟使用。 本文以windows系统来做案例。 下载rocketmq和启动: RocketMQ 在 windows 上运行…...
飞天使-vim简单使用技巧
此文是记录技巧使用,如果想节约时间,可以直接看最后一个章节 vim 的介绍 vim号称编辑器之神,唯快不破,可扩展,各种插件满天飞。 vi 1991 vim 1.14 vim四种模式 普通模式: 移动光标, 删除文本,…...
分布式搜索引擎----elasticsearch
目录 1、初识elasticsearch 1.1、什么是elasticsearch 1.2.ELK技术栈 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的区别 3、elasticsearch中的概念理解 3.1、文档和字段 3.2、索引和映射 3.3、mysql与elasticsearch 1、初识elasti…...
AnnotationConfigApplicationContext类和ClasspathXmlApplicationContext类的区别?
在 Spring Framework 中,AnnotationConfigApplicationContext 和 ClasspathXmlApplicationContext 是两个不同的应用程序上下文实现,用于配置和管理 Spring Bean 容器。它们之间的主要区别在于配置的方式和使用场景。 1. **AnnotationConfigApplication…...
使用VSCode SSH实现公网远程连接本地服务器开发的详细教程
文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...
Codeforces Round 894 (Div. 3)
还是打一下卡!!! (A,B,C) 目录 A. Gift Carpet 链接 : 题面 : 题目意思 : 思路 : 代码 : B. Sequence Game 链接 : 题面 : 编辑 题目意思 : 思路 : 代码 : C. Flower City Fence 原题链接 : 题面 : 题目意思 : 思路 : 代码 : A. Gift Carpet 链…...
ACL2023 Prompt 相关文章速通 Part 1
Accepted Papers link: ACL2023 main conference accepted papers 文章目录 Accepted PapersPrompter: Zero-shot Adaptive Prefixes for Dialogue State Tracking Domain AdaptationQuery Refinement Prompts for Closed-Book Long-Form QAPrompting Language Models for Lin…...
“R语言+遥感“水环境综合评价方法
详情点击链接:"R语言遥感"水环境综合评价方法 一:R语言 1.1 R语言特点(R语言) 1.2 安装R(R语言) 1.3 安装RStudio(R语言) (1)下载地址 &…...
数据结构之哈希
哈希 1. 哈希概念2. 哈希冲突3. 哈希冲突解决3.1 哈希表的闭散列3.2 哈希表的开散列 2. 哈希的应用2.1 位图2.2 布隆过滤器 哈希(Hash)是一种将任意长度的二进制明文映射为较短的二进制串的算法。它是一种重要的存储方式,也是一种常见的检索方…...
可视化绘图技巧100篇基础篇(七)-散点图(一)
目录 前言 适用场景 图例 普通散点图与可视化 曲线图 气泡图...
关于什么是框架
框架(Framework)是一个框子——指其约束性,也是一个架子——指其支撑性。 IT语境中的框架,特指为解决一个开放性问题而设计的具有一定 性的支撑结构。在此结构上约束可以根据具体问题扩展、安插更多的组成部分,从而更迅…...
学校网站建设必要性/网站推广策略
1.由于连接数据库不止一次使用,新建一个专门用于连接数据库的文件conn.php.//链接数据库服务器mysql_connect("localhost","root", ""); //密码为空字符、//我当前网页的编码是utf8mysql_query("set names utf8"); /…...
淘宝网站建设靠不靠谱/今日国际新闻最新消息
思路对于一个数N,N的最高位数值为T,N长度为L ,那么我们可以吧N分为两个部分 ,令MN-T*10^(L-1)1, 分割为[0,M-1] 和 [M,A]两个部分,第一个部分可以用递归来求解, 第二个部分要计算了, 首先我们知道 000~999当中存在一的…...
wordpress图形验证码/公司seo是什么意思
问题描述按照网友提供的 phoenix 映射已存在的 hbase 表 demo 时,表映射正常,但是使用 phoenix 查询时,一直查询不到数据。举个栗子:hbase shell 插入数据create test1,iput test1,1,i:name,zhangsanput test1,2,i:name,lisiput t…...
建设部资质升级网站/seo案例模板
我在这里有一个应用程序添加了数字.我这里有4个edittexts.我想要发生的是,当我在其中一个edittexts中没有输入时,它会假设我输入了0.如何才能完成?这是我的代码:public class Order extends Activity {Button GoBackHome;private Button button1;private…...
网站开发环境是什么意思/江苏关键词推广seo
个人网站流量和金钱的关系 可以算出每个月赚到的钱,以下数据仅供参考,列出的数据为一般统计数据,站点不包括非法站点,比如**站点,不包括卖产品的商业站点,纯属于各类的个人站点。 网站每天访问量 运做每个月赚到的钱 1000IP 20…...
网站seo优化合同/百度推广代理商与总公司的区别
城市轨道交通运营管理就业方向主要有列车乘务、列车驾驶及操作、酒店管理、人力资源专员及助理、助理、秘书、文员、事业单位人员、公交或地铁乘务、车站货运作业组织员。城市轨道交通运营管理从业方向1、城市轨道交通行车组织及调度组织、客运组织、综合管理、地铁公司、城市轻…...