Java Singleton Design Pattern (单例模式 SE7 Gold)

【Java设计模式】Java设计模式之(一)单例模式(Singleton Pattern) 本文继续介绍23种设计模式详解系列之单例模式。 一、单例模式的定义 指一个类只有一个实例,且该类能自行创建这个实例的一种模式。 二、单例模式的常见例子 Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误;在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中 阅读详情

singleton design pattern offer 2 things:
one and only one instance of the class, and a global single point of access to that object

下面的例子用一个private的构造函数阻止了instance的生成,所以不能用new生成一个新的instance,只能用getInstance()来得到instance,可以看到生成instance后把它赋给static成员myInstance,所以可以always return the same object:

public class Logger{
   //declare the constructor private to prevent clients from instantiating..
   private Logger(){}
   private static Logger myInstance;
   //the static method to get instance..
   public static Logger getInstance() {
   	  if (myInstance == null) {
   	  	 myInstance = new Logger();
   	  }
   	  return myInstance;
   }
}

但是上面的实现有什么不妥之处?上面的实现对于单线程是有效的,但是对于多线程,仍然可以得到很多的object,违背了singleton的理念

对于多线程的singleton,看下面的例子
getInstance()方法中用到了synchronized修饰,每次只能一个线程访问,确保每次只能生成一个instance

public class Logger{
   //declare the constructor private to prevent clients from instantiating..
   private Logger(){}
   private static Logger myInstance;
   //the static method to get instance..
   public static synchronized Logger getInstance() {  //added..
   	  if (myInstance == null) {
   	  	 myInstance = new Logger();
   	  }
   	  return myInstance;
   }
}

上面的实现有什么问题?poor performance。
其实本意是在第一次生成instance的时候用synchronized进行限制,但是整个method都变成了synchronized,导致多线程每次调用getInstance(), 这个地方会变成performance bottleneck

那么考虑把synchronized移到第一次生成instance的地方,是否就完美解决上述问题

public class Logger{
   //declare the constructor private to prevent clients from instantiating..
   private Logger(){}
   private static Logger myInstance;
   //the static method to get instance..
   public static Logger getInstance() {
   	  if (myInstance == null) {
   	     synchronized (Logger.class) {   //added..
   	  	 	myInstance = new Logger();
   	  	 }
   	  }
   	  return myInstance;
   }
}

仍然会有问题,如果两个线程同时第一次生成instance,同时判断到了myInstance== null
synchronized无法保护上面的判断,所以仍然会生成两个object

因此解决方法是实行双重检查myInstance== null, 但是这种方法不被推荐,因为erroneous out of order writes allowed by java memory model problem的关系, 虽然memory model已经修复了这个问题

public class Logger{
   //declare the constructor private to prevent clients from instantiating..
   private Logger(){}
   private static Logger myInstance;
   //the static method to get instance..
   public static Logger getInstance() {
   	  if (myInstance == null) {
   	     synchronized (Logger.class) {
   	        if (myInstance == null) {   //added..
   	  	 		myInstance = new Logger();
   	  	 	}
   	  	 }
   	  }
   	  return myInstance;
   }
}

下面用另一种内部类的方法实现singleton
因为内部类are not loaded until they are referenced
仍然用private限制了构造函数

public class Logger{
   //declare the constructor private to prevent clients from instantiating..
   private Logger(){}
   private static Logger myInstance;
   public static class LoggerHolder {
   	  public static Logger logger = new Logger();
   }
   public static Logger getInstance() {
   	  return LoggerHolder.logger;
   }
}
Android 集成 Google 与 Facebook 第三方登录实战详解(2024版) 本文详细介绍了2024年Android应用集成Google与Facebook第三方登录的完整实战指南。通过分步教程和代码示例,帮助开发者快速实现一键登录功能,提升用户体验和注册转化率,同时涵盖隐私合规和常见错误处理的最佳实践。 阅读详情

相关推荐

VN1630A硬件配置指南:手把手教你用CanApe搭建XCP标定工程(附ELF文件配置技巧)

本文详细介绍了如何使用VN1630A硬件和CanApe软件搭建XCP标定工程,包括硬件配置、CanApe工程创建、ELF文件处理及XCP协议层配置等关键步骤。特别针对实际项目中常见的错误和细节问题提供解决方案,帮助工程师高效完成ECU参数标定工作。

git9versioner的博客 1154

单例模式(singleton)

文章目录单例模式解释形式饿汉式(静态常量)优点缺点饿汉式(静态代码块)优缺点和上面一样懒汉式(线程不安全)优点缺点懒汉式(线程安全,同步方法)优缺点分析懒汉式(线程安全,同步代码块)结论双重检查优点静态内部类优点枚举优点使用场景 单例模式 解释 单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。 形式 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全,同

pmc0_0的博客 305

避坑指南:RK3576+Android14适配移远5G模组(RG200U)时,我遇到的3个‘巨坑’及解决方案

本文详细记录了RK3576芯片适配Android14系统与移远RG200U 5G模组过程中遇到的三大技术难题:RIL服务启动失败、HIDL兼容性矩阵配置错误及ttyUSB权限冲突。通过实战案例提供了动态库拷贝、HIDL版本链声明和SELinux策略调整等解决方案,帮助开发者高效完成5G模组集成,特别适用于基于kernel6.1的嵌入式开发场景。

weixin_30664051的博客 389

java设计模式(Design Pattern) — 单例模式(Singleton Pattern)

本文参考ImportNew中的文章:http://www.importnew.com/6662.html 单例模式是java中常使用的一种设计模式,通过阻止外部实例化来修改,来控制所建对象的数量。 单例模式的特点: 1. 构造函数私有化; 2. 建立自己私有化的实例; 3. 创建公共静态方法,为外界提供调用单一实例的接口。 下面看一个单例模式的例子: Singleton Class:

zhenzi_1989的专栏 882

Windows 下安装 ros2 的超详细教程

Windows11 ROS安装

2401_83363439的博客 3316

Mamba vs YOLO:目标检测选型指南(附实际项目对比)

本文深入对比了Mamba和YOLO在目标检测领域的性能差异与应用场景。通过实际项目数据,分析了两者在城市交通监控、工业质检等场景下的表现,提供了详细的选型指南和部署优化建议,帮助开发者根据实时性、精度等需求选择最适合的解决方案。

weixin_29062255的博客 367

设计模式之---单例模式(Singleton Design Pattern)

场景 对象只要利用自己的属性完成了自己的任务.那该对象就是承担了责任。 除了维持了自身的一致性,该对象无需承担其他任何责任。 如果该对象还承担着其他责任,而其他对象又依赖于该特定对象所承担的贵任,我们就需要得到该特定对象。 就像我和我的女朋友去超市购物使用的购物车一样。 意图 将类的责任集中到唯一的单体对象中,确保该类只有一个实例. 并且为该类提供一个全局访间点。 难点 不在于单体

陌路旧梦 2601

保姆级教程:用CellOracle 0.10.13从单细胞数据构建基因调控网络(附完整代码)

本文提供了一份详细的CellOracle 0.10.13使用指南,帮助用户从单细胞数据构建基因调控网络。通过Python接口,即使是生物信息学新手也能快速掌握数据准备、KNN插补、GRN计算及可视化等关键步骤。文章包含完整代码和实用技巧,助力单细胞转录组数据分析。

weixin_42563415的博客 720

设计模式 - 创建型设计模式小结

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net Definition Ensure a class has only one instance and provides a global point of access to it. Participants The classes...

了解➔熟悉➔掌握➔精通 3万+

华为od面试手撕真题【分解质因数】

华为od面试手撕真题【分解质因数】

MISAYAONE的博客 1127

Unity之Timeline教程

Unity Timeline是Unity的一种时间轴编辑器工具,用于制作和管理游戏中的动画、剧情以及事件触发。它提供了直观的界面,使得开发者可以通过拖放操作轻松创建和编辑时间轴。Activation Track:用于控制物体的激活状态。可以在轨道上添加关键帧,控制物体的激活和非激活状态。Animation Track:用于处理物体的动画。可以在此轨道上添加关键帧,编辑物体的动画状态。Audio Track:用于处理场景中的音频。可以管理音频的播放、暂停、淡入淡出等操作。

TxNet 9437

Java设计模式—单例设计模式(Singleton Pattern)完全解析

认真做好每一件自己下定决心要做的事。

乐于分享,乐于讨论,欢迎大家积极讨论 3万+

深度强化学习 | 基于SAC算法的移动机器人路径跟踪(附Pytorch实现)

软性演员-评论家(Soft Actor-Critic, SAC)算法是基于最大熵原理的离线策略方法,本节将基于深度强化学习中的SAC算法实现移动机器人的路径跟踪,介绍网络设计、动作空间设计和奖励函数设计,并提供Pytorch实现加深理解

FRIGIDWINTER的博客 5732

设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 单例模式(Singleton Pattern) - Java实现

单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,提供全局访问的方法。实现单例模式的3个步骤: 1、private构造函数; 2、含有一个该类的private static对象; 3、提供public static方法,创建或获取本身的静态私有对象。 3种实现方式:饿汉式单例类、懒汉式单例类、IoDH。

Z 581

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java 单根模式(Singleton Pattern) 学习

刚开始接触Singleton pattern,用以下代码实现:Code 1public class Config { //Log4j instance private static Logger logger = Logger.getLogger(Config.class); // Class member, read config from properties fi

cloud的技术积累 1265

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java实现多种单例模式SingletonPattern

纠结了好久,要不要写一篇博客记录自己学习单例模式的过程。网上相关博客多的很,好像没什么必要重复造一个老轮子。 但是最近面试、看面试书,发现单例模式还是经常会被考到的,而且作为设计模式中相对来说比较简单的一种,掌握好还是很有必要的。 而掌握知识的最好途径不是看别人的文章,而是自己亲手造一个,想必那样体会更深。 好了废话不多说。 单例模式的作用从名字上就可以看出来:保证某个类的实例

张拭心的博客 shixinzhang 3496

SAP B1中文培訓教材_SDK

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

java singleton design pattern

<br />from: http://www.javacoffeebreak.com/articles/designpatterns/index.html<br />For those who haven't heard of design patterns before, or who are familiar with the term but not its meaning, a design pattern is a template for s

Andrew's Blog 1416

DesignPattern_Java:SingletonPattern

单例模式 SingletonPattern Ensure a class has only one instance,and provide a global point of access to it. 单例模式的主要作用是确保一个类只有一个实例存在。 懒汉式单例类:第一次引用类时,才进行对象实例化。 package com.DesignPattern.Creational....

weixin_30569001的博客 162

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 215

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 325

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 140

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 112

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 190

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 352

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 102

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 608
上一篇: leetcode 80. Remove Duplicates from Sorted Array II
下一篇: leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal(前序和中序遍历重建二叉树)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值