/**
* 一、单例是什么?
* 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。即:让整个生命周期内只有一个实例。
* 二、为什么使用单例?——内存、资源
* 1、一个类专门提供一些公共功能供别人调用,而本身并不会处理业务逻辑,那么创建多个实例,会消耗内存,造成不必要的开销,此时需要单例。
* 2、如果创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时就要考虑使用单例模式。
* 3、总的来说,如果该类 需要消耗较多资源 或者 没有多个实例,考虑使用单例。
* 三、单例实现方式?
* 常见单例模式有如下五种写法:懒汉式,双重校验锁,静态内部类,饿汉式和枚举;以及一种不常见写法:使用容器实现单例。
* 懒汉式:非线程安全
* 双重校验锁:线程安全
* 静态内部类:线程安全
* 饿汉式:线程安全
* 枚举:线程安全
* 容器实现:非线程安全
* 四、单例优缺点?
* 优点:1、减少内存开销;2、减少系统性能开销;3、避免对资源的重复占用;4、优化和共享资源访问。
* 缺点:1、不容易扩展,基本只能通过修改代码去扩展;2、如果持有了context就容易引发内存泄漏,建议使用ApplicationContext。
*/
// 五、代码实现
///**
// * 懒汉式1:原始版,会有多线程并发问题。——不建议使用
// * 由于instance是静态的,因此能够保证程序运行过程中只存在一个实例。
// * 但是针对多线程情况,就可能有问题。当有多个线程同时执行到line行时,会各自new一个对象出来。存在多个实例,违背了单例模式的概念。
// */
//public class Singleton{
// private static Singleton instance;
// private Singleton() {}
// public static Singleton getInstance() {
// if (instance == null) {
// instance = new Singleton(); // line
// }
// return instance;
// }
//}
///**
// * 懒汉式2:改进懒汉式1,多线程高并发时效率低。——不建议使用
// */
//public class Singleton{
// private static Singleton instance;
// private Singleton() {}
//
// // 对方法加锁
// public static synchronized Singleton getInstance() {
// if (instance == null) {
// instance = new Singleton();
// }
// return instance;
// }
//
//// // 对对象加锁,和对方法加锁一个效果,是走向懒汉式3的一个中间过程
//// public static Singleton getInstance() {
//// synchronized (Singleton.class) {
//// if (instance == null) {
//// instance = new Singleton();
//// }
//// return instance;
//// }
//// }
//}
/**
* 懒汉式3:改进懒汉式2,Double-Checked Locking(DCL)双重校验锁方式。——一般情况下可使用
* 1、并不是每次进入getInstance方法都要获得锁。对instance访问分为两类:读和写。仅当instance为null的时候才会写,此时获得锁;其他情况就只是读操作,此时不需要获得锁了。
*
* 2、DCL的优点:资源利用率高,第一次执行getInstance时单例对象才会被实例化,效率高。
*
* 3、DCL的缺点:第一次加载时反应稍慢,也由于Java内存模型的原因偶尔会失败。在高并发环境下也有一定的缺陷,虽然发生概率很小。
*
* 4、小插曲之JDK1.5之前DCL的小缺点:
* JDK1.5之前的Java中无法安全使用DCL来实现单例模式,尽管得到了Singleton的正确引用,但是却有可能访问到其成员变量的不正确值。我们知道instance = new Singleton();语句,实际上它并不是一个原子操作,这句代码最终会被编译成多条汇编指令,大致包括以下3件事情:
* (1)给Singleton的实例分配内存;(2)调用Singleton()的构造函数,初始化成员字段;(3)将instance对象指向分配的内存空间(此时instance就不是null了)。
* 但由于Java编译器允许处理器乱序执行,以及JDK1.5之前JMM(Java Memory Model,即Java内存模型)中Cache、寄存器到主内存回写顺序的规定,上面的第2和第3的顺序是无法保证的。
* volatile屏蔽指令重排序的语义在JDK1.5中才被完全修复,可参见java的“happen-before”八大原则规则的第三条,volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作。
*
* ⚠️注意:DCL在一定程度上解决了资源消耗、多余的同步、线程安全等问题,但它还是在某些情况下出现失效的问题,虽然发生概率很小。
*/
public class Singleton{
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
///**
// * 静态内部类单例模式——推荐使用
// * 可以同时保证线程安全、延迟加载,以及单例对象的唯一性。
// * 1、它与饿汉式一样,也是利用了类加载机制来保证只创建一个instance实例,因此不存在多线程并发的问题。
// * 2、当第一次加载Singleton类时并不会初始化instance,只有在第一次调用getInstance方法时才会导致instance被初始化,因此做到了延迟加载。
// */
//public class Singleton {
// private static class SingletonHolder {
// private static final Singleton instance = new Singleton();
// }
// private Singleton() {}
// public static Singleton getInstance() {
// return SingletonHolder.instance;
// }
//}
///**
// * 饿汉式
// */
//public class Singleton {
// private static final Singleton instance = new Singleton();
// private Singleton() {}
// public static Singleton getInstance() {
// return instance;
// }
//}
///**
// * 枚举
// * 访问方式:SingletonEnum.instance.method();
// * 借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
// */
//public enum SingletonEnum {
// instance;
// private SingletonEnum() {}
// public void method(){
// }
//}
///**
// * 使用容器实现单例模式
// *《在Android源码设计模式解析与实战》一书中还提到了使用容器实现单例模式的方式,便于管理,以及可以隐藏具体实现和降低耦合度等,但不是线程安全的,由于不是常见实现方式,就不再在此赘述。
// */
// 六、总结
// 不管以哪种形式实现单例模式,它们的核心原理都是将构造函数私有化,并且通过静态方法获取一个唯一的实例,在这个获取的过程中必须保证线程安全、防止反序列化导致重新生成实例对象的问题。
// 总的来说,选取哪种方式实现单例模式取决于项目本身,比如:是否是复杂的并发环境、JDK版本是否过低、单例对象的资源消耗等
相关推荐
cartographer从入门到精通(一):cartographer介绍
Cartographer的架构图我们可以看到白色框出来的三个区域,分别是Input Sensor Data(数据输入模块)Local SLAM(局部SLAM模块)Global SLAM (background thread)(全局SLAM模块)下面我们分别介绍一下这几个模块。
Java学习笔记【入门】(1):Java版本介绍
Java EE、JavaSE和JavaME的区别 首先Java是一门编程语言,根据需求不同分为三个版本 java SE Java SE(Java Platform Standard Edition:Java 标准版)以前称为 J2SE,它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java EE ...
头歌 操作系统 课堂练习2.1:外部中断 第2关:第一次时钟中断
将答案0x796c输入到workspace/mushixun/恢复点的地址.txt中的括号里即可,随后使用kill命令防止对第三关的环境造成影响。
Java版本历史和新特性
1.Java发展史以及新特性简要说明: Java创始人之一:詹姆斯·高斯林。 1991年 Green项目成立。目的:由于当时硬件领域出现了单片式计算机系统,廉价的系统可以提升消费类电子产品的智能化程度,成立Green小组。 1995年(Oak 橡树)因特网环境下。 1996年 1月23日,开发代号为Oak(橡树),发布JDK1.0,标志着JA...
Vivado DDR IP自定义型号避坑指南:如何正确填写CSV参数表(附常见错误排查)
本文详细解析了Vivado DDR IP自定义型号配置中的关键步骤与常见问题,特别针对DDR4内存颗粒的参数提取、CSV参数表填写误区及故障排查提供了实用指南。通过实际案例和调试技巧,帮助工程师避免配置陷阱,提升DDR4系统稳定性和性能。
安川机器人SOCKET 通讯
命令 功能 参数 示例 返回 SelectJob 选择程序 JobName LineNo SelectJob TEST 0 #SelectJob,Ok StartJob 启动程序 JobName StartJob TEST #StartJob,Ok Pause 暂停当前程序 - Pause #Pause,Ok Continue 继续当前程序 - Continue #Continue,Ok ServoOn 伺服上电 - ServoOn #ServoOn,Ok ServoOf...
Java的各个版本和各个版本的历史版本号的关系与解读
1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要里程碑,标志着Java成为一种独立的开发工具。 1997年2月,JDK 1.1面世。 1998年12月8日,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(...
python电子学会三级的零碎笔记
示例:如果s = ['a', 'b', 'c'],则' '.join(s)+'\n'的结果是'a b c\n',写入文件时所有元素会在一行内显示,每个元素之间用空格分隔,末尾有一个换行符。(2) '\n'.join(s):如果s = ['a', 'b', 'c'],则'\n'.join(s)的结果是'a\nb\nc',写入文件时每个元素会占据文件的一行。(1) ' '.join(s)+'\n':这种方式首先将列表s中的每个元素通过空格连接成一个字符串,然后在字符串末尾添加一个换行符\n。
定义一个单例模式的类,在这个类中,只有唯一的实例,不能new出来其他的实例对象。
using System; namespace MySingleton{ class Class1 { [STAThread] static void Main(string[] args) { Si
Windows10 使用Apple Studio Display显示器的设置
AppleStudioDisplay显示器购买花了近1.5wRMB,由于为windows台式机,显卡为NVIDAGTX-1660,而AppleStudioDisplay只有雷电接口,尝试了很多种转接方式,均以失败告终,最终使用贝尔金VR线成功,,附图如下这边也测试过NVIDARTX-2060Super、NVIDAGTX-1650显卡,都是能点亮的,NVIDA1650存在关机重启后黑屏,不稳定现象,2060也存在关机重启后不亮现象,后面发现1660s很稳定。...
OpenCV实战(1)——OpenCV与图像处理基础
OpenCV 是一个跨平台计算机视觉和机器学习库,实现了图像处理和计算机视觉方面的很多通用算法。本节将介绍 OpenCV 的基础知识,以及如何编译运行 OpenCV 程序,并介绍如何完成最基本的图像处理任务——读取、显示和保存图像。除此之外,鼠标事件和图形绘制也是 OpenCV 计算机视觉项目中常用的基本功能,本节介绍了如何使用这两个重要的 OpenCV 功能。
单例模式的几种写法(附介绍)
概述 单例模式的要点有三个: 一是某个类只能有一个实例; 二是它必须自行创建这个实例; 三是它必须自行向整个系统提供这个实例。 从具体实现角度来说,就是以下三点: 一是单例模式的类只提供私有的构造函数, 二是类定义中含有一个该类的静态私有对象, 三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。 优点 实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从
Trae+雪球MCP,化身专业的股票分析师(玩转100个MCP系列第二弹)
大家好呀,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧、经验以及前沿资讯,有兴趣的可以关注我的公众号,一起学习,共同进步。第二弹,使用Trae+雪球MCP,获取股票实时行情,分析股票走向等,写代码间隙看看股票价格,研究研究行情,哈哈。真的很不错呀,最关键的是,足够隐蔽,同事以为你在写代码,实际你在浏览股票行情,哈哈,感兴趣的可以试一下哦。说实话,沧州明珠这只股我算是砸手里了,不过还好买的不多,哈哈。
Java--设计模式之单例模式+保证线程安全的5种写法(懒、汉、内、双、枚)
2
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
单例模式的五种写法
设计模式(Design pattern),提供了在软件开发过程中面临的一些问题的最佳解决方案,是Java开发者必修的一门课程。主要分创建型模式、结构型模式和行为型模式。其中接下来我们要写的是单例模式,属于创建型模式。 单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧...
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
Java笔记——实现单例模式的七种写法
双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检 测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问 题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。枚举类实现单例模式是极力推荐的单例实现模式,因为枚举类型是线程安全的,并且只会装载一 次,设计者充分的利用了枚举的这个特性来实现单例模式,枚举的写法非常简单,而且枚举类型是 所用单例实现中唯一一种不会被破坏的单例实现模式。instance对象是随着类的加载而创建的。
廖雪峰Python教程[完整版]
廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白
Java 设计模式——单例模式6种写法:从原理到 SpringBoot 落地
本文全面解析Java单例模式的6种实现方式,包括静态内部类、双重校验锁、枚举等。重点分析了各方案的优缺点、适用场景及实现原理,特别强调线程安全、懒加载和防破坏(反射/反序列化)等关键问题。其中静态内部类作为日常开发首选,双重校验锁适合高并发场景,枚举单例则是最安全的防破坏方案。文章还通过代码示例直观展示实现细节,为开发者提供从理论到实践的系统指导。
单例模式5种写法
如果`instance`为`null`,进入同步代码块,再次检查`instance`是否为`null`,如果仍为`null`,则创建实例。首次调用时,`instance`为`null`,会创建一个新实例并赋值给`instance`,之后再次调用`getInstance()`时,直接返回已创建的实例。- 第一次检查`instance`是否为`null`,如果不为`null`,直接返回实例,避免了不必要的同步。- 在类加载时就创建实例,`instance`变量被`final`修饰,保证了其不可变性。
单例模式的写法
单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好、用对单例模式,还真得费一番脑筋。本文对 Java 中常见的单例模式写法做了一个总结,如有错漏之处,恳请读者指正。 饿汉法 顾名思义,饿汉法就是在第一次引用该类的时候就创建对象实例,而不管实际是否需要创建。代码如下: public class Singleton { private static Singleton = new Singleton(); private Singleton() {} public stat
java单例模式——详解JAVA单例模式及8种实现方式
本文转载自:java单例模式——详解JAVA单例模式及8种实现方式_EatingSoilLang的博客-优快云博客_java单例模式 ## 单例模式是最简单也是最基础的设计模式之一,下边一起学习一下单例模式! 一.单例模式的定义: 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler
java单例模式的写法及优缺点
单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生。一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式。但是除了这两种方式,本文还会介绍其他几种实现单例的方式,让我们来一起看看吧。 简介 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序...
Java单例模式的6种写法
在Java中,单例有很多种写法,面试时,手写代码环节,除了写算法题,有时候也会让手写单例模式,这里记录一下单例的几种写法和优缺点。 初级写法 懒汉式 饿汉式 双锁检验 内部类 枚举式 1.初级写法 public class Singleton { private static Singleton singleton = null; publi...
Java单例模式的七种不同写法
JAVA单聊模式的不同写法 一. 饿汉 /** * 饿汉 */ public class Singleton1 { private static final Singleton1 INSTANCE = new Singleton1(); private Singleton1() { } public static Singleton1 getIns
浅谈单例模式的几种写法
概述:随着jdk的版本的发展,单例模式的写法也随之增加并逐渐完善。博主从接触java就听到单例模式,闲来无事喜欢看杂七杂八的文章,今天看到枚举单例,突发感想记录下来。总结之,目前单例模式有三种写法。 一、最原始的单例模式写法 归纳起来三个步骤,静态方法、私有构造器、静态常量 public class A { private static final A instance =
Java单例模式的七种写法
第一种(懒汉,线程不安全): 类初始化的时候并不创建,想用的时候创建 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null
设计模式 - Java中单例模式的6种写法及优缺点对比
目录 1 为什么要用单例模式 1.1 什么是单例模式 1.2 单例模式的思路和优势 2 写法① - 饥饿模式 2.1 代码示例 2.2 优缺点比较 3 写法② - 懒惰模式 3.1 代码示例 ...
1052



被折叠的 条评论
为什么被折叠?



