三、《重学设计模式》-单例模式
单例模式
单例模式分为四大类,饿汉式、懒汉式、静态内部类、枚举
饿汉式
优点:类装载时进行实例化,避免同步问题
缺点:造成内存浪费
实现一
1.构造器私有化
2.内部创建对象实例
3.提供静态方法
public class Type1 {public static void main(String[] args) {SingleTon1 instance = SingleTon1.getInstance();SingleTon1 instance1 = SingleTon1.getInstance();System.out.println(instance == instance1);System.out.println(instance.hashCode());System.out.println(instance1.hashCode());}
}class SingleTon1{// 加载实例化private static final SingleTon1 instance = new SingleTon1();private SingleTon1(){}public static SingleTon1 getInstance(){return instance;}
}
实现二
1.构造器私有化
2.静态变量
3.静态代码块初始化
public class Type2 {public static void main(String[] args) {SingleTon2 instance = SingleTon2.getInstance();SingleTon2 instance1 = SingleTon2.getInstance();System.out.println(instance == instance1);System.out.println(instance.hashCode());System.out.println(instance1.hashCode());}
}class SingleTon2{private static SingleTon2 instance;private SingleTon2(){}// 静态块static {instance = new SingleTon2();}public static SingleTon2 getInstance(){return instance;}
}
懒汉式
方案一(线程不安全)
1.静态变量
2.构造函数私有化
3.静态方法调用时创建实例
public class Type3 {public static void main(String[] args) {SingleTon3 instance = SingleTon3.getInstance();SingleTon3 instance1 = SingleTon3.getInstance();System.out.println(instance == instance1);System.out.println(instance.hashCode());System.out.println(instance1.hashCode());}
}class SingleTon3 {private static SingleTon3 instance;private SingleTon3() {}public static SingleTon3 getInstance() {if (instance == null) {instance = new SingleTon3();}return instance;}
}
方案二(线程安全同步锁)
1.静态变量
2.构造函数私有化
3.静态方法调用时加synchronized同步锁,创建实例
缺点:效率低
public class Type4 {public static void main(String[] args) {SingleTon4 instance = SingleTon4.getInstance();SingleTon4 instance1 = SingleTon4.getInstance();System.out.println(instance == instance1);System.out.println(instance.hashCode());System.out.println(instance1.hashCode());}
}class SingleTon4 {private static SingleTon4 instance;private SingleTon4() {}// 同步锁,所有线程阻塞排队 public static synchronized SingleTon4 getInstance() {if (instance == null) {instance = new SingleTon4();}return instance;}
}
方案三(同步代码块,线程不安全, 不能用、不能用、不能用)
public class Type5 {public static void main(String[] args) {SingleTon5 instance = SingleTon5.getInstance();SingleTon5 instance1 = SingleTon5.getInstance();System.out.println(instance == instance1);System.out.println(instance.hashCode());System.out.println(instance1.hashCode());}
}class SingleTon5 {private static SingleTon5 instance;private SingleTon5() {}public static SingleTon5 getInstance() {if (instance == null) {// 同步代码块,但是有两个线程同时进入if判断,就会创建多个实例synchronized (Type5.class){instance = new SingleTon5();}}return instance;}
}
方案四(双重检查)
优点:线程安全、懒加载、效率高
public class Type6 {public static void main(String[] args) {SingleTon6 instance = SingleTon6.getInstance();SingleTon6 instance1 = SingleTon6.getInstance();System.out.println(instance == instance1);System.out.println(instance.hashCode());System.out.println(instance1.hashCode());}
}class SingleTon6 {private volatile static SingleTon6 instance;private SingleTon6() {}public static SingleTon6 getInstance() {if (instance == null) {synchronized (Type5.class){if(instance == null){instance = new SingleTon6();}}}return instance;}
}
静态内部类
静态内部类特点,外部类装载时,内部类不会被装载
调用静态方法时,装载静态内部类,线程安全
静态内部类中定义静态变量
优点:静态内部类实现了延迟加载,线程安全有jvm控制
public class Type7 {public static void main(String[] args) {SingleTon7 instance = SingleTon7.getInstance();SingleTon7 instance1 = SingleTon7.getInstance();System.out.println(instance == instance1);System.out.println(instance.hashCode());System.out.println(instance1.hashCode());}
}class SingleTon7 {private SingleTon7() {}private static class SingleTon7Holder {private static final SingleTon7 INSTANCE = new SingleTon7();}public static SingleTon7 getInstance() {return SingleTon7Holder.INSTANCE;}
}
枚举
避免线程不安全,防止反序列化重新创建新对象
public class Type8 {public static void main(String[] args) {SingleTonEnum.INSTANCE.whateverMethod();}
}enum SingleTonEnum {INSTANCE;public void whateverMethod() {System.out.println("hhh");}
}
举例
JDK 中 RunTime

总结
1.频繁创建或销毁的对象适合使用单例模式
2.创建对象耗时过长或者资源过多适合使用单例模式
3.频繁用到的对象,类似工具类等,适合使用单例模式
相关文章:
三、《重学设计模式》-单例模式
单例模式 单例模式分为四大类,饿汉式、懒汉式、静态内部类、枚举 饿汉式 优点:类装载时进行实例化,避免同步问题 缺点:造成内存浪费 实现一 1.构造器私有化 2.内部创建对象实例 3.提供静态方法 public class Type1 {public s…...
SpringBoot3整合Swagger3时出现Type javax.servlet.http.HttpServletRequest not present错误
目录 错误详情 错误原因 解决方法 引入依赖 修改配置信息 创建文件 访问 错误详情 错误原因 SpringBoot3和Swagger3版本不匹配 解决方法 使用springdoc替代springfox,具体步骤如下: 引入依赖 在pom.xml文件中添加如下依赖: <…...
项目实战--网页五子棋(匹配模块)(4)
上期我们完成了游戏大厅的前端部分内容,今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后,我们可以维护好用户的websocket会话,把用户表示为在线状态,方便获取到用户的websocket会话 package org.ting.j20250110_g…...
Python闭包知多少
目录 目标 Python版本 概述 实战 基本语法 数据隐藏和封装 延迟计算 回调函数 目标 熟悉闭包语法结构,通过案例来了解闭包的使用场景。 Python版本 Python 3.9.18 概述 闭包(Closure) 闭包是一个函数对象(即内部函数或被…...
【Java毕业设计】商城购物系统(附源码+数据库脚本)
本系统是基于JavaEEServletJSPMysql实现的商城购物系统。包括用户登录、用户注册、商品分类、添加购物车、订单支付等基本功能,具体页面及功能如下: 感谢阅读! 如需获取完整项目源码及更多项目信息,可添加V:...
css特异性,继承性
html <div class"introduce"><div class"title">介绍</div><div class"card-box"><div class"card"><div class"title">管理</div></div></div> </div> scs…...
POST请求提交数据的三种方式及通过Postman实现
1、什么是POST请求? POST请求是HTPP协议中一种常用的请求方法,它的使用场景是向客户端向服务器提交数据,比如登录、注册、添加等场景。另一种常用的请求方法是GET,它的使用场景是向服务器获取数据。 2、POST请求提交数据的常见编…...
Spring Boot 整合 Spring MVC /(整合Web)笔记
1. Spring Boot 整合 Web 功能 Spring Boot 通过自动配置简化了 Spring MVC 的集成。只需在 pom.xml 中添加 spring-boot-starter-web 依赖,Spring Boot 就会自动配置 Spring MVC 的相关组件。 <dependency><groupId>org.springframework.boot</gr…...
[特殊字符]清华大学:DeepSeek从入门到精通.pdf(清华领航,驾驭DeepSeek,开启AI新境界)
不愧是清华大学出品的deepseek手册,简直是新手 福音,非常实用! 这份《DeepSeek:从入门到精通》手册从基础到高 阶,手把手教你玩转DeepSeek,特别适合刚入门的小白,拿来就能用! 1.Deep…...
LeetCode 热题100 2. 两数相加
LeetCode 热题100 | 2. 两数相加 大家好,今天我们来解决一道经典的算法题——两数相加。这道题在 LeetCode 上被标记为中等难度,要求我们将两个非空的链表表示的整数相加,并以相同形式返回一个表示和的链表。下面我将详细讲解解题思路&#…...
深度学习技术全景图:从基础架构到工业落地的超级进化指南
🔍 目录导航 基础架构革命训练优化秘技未来战场前瞻 🧩 一、基础架构革命 1.1 前馈神经网络(FNN) ▍核心结构 import torch.nn as nnclass FNN(nn.Module):def __init__(self):super().__init__()self.fc1 nn.Linear(784, 25…...
PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)
PyTorch-基础 环境准备 CUDA Toolkit安装(核显跳过此步骤) CUDA Toolkit是NVIDIA的开发工具,里面提供了各种工具、如编译器、调试器和库 首先通过NVIDIA控制面板查看本机显卡驱动对应的CUDA版本,如何去下载对应版本的Toolkit工…...
IO/网络IO基础全览
目录 IO基础CPU与外设1. 程序控制IO(轮询)2. 中断中断相关知识中断分类中断处理过程中断隐指令 3. DMA(Direct Memory Access) 缓冲区用户空间和内核空间IO操作的拷贝概念传统IO操作的4次拷贝减少一个CPU拷贝的mmap内存映射文件(m…...
【DeepSeek-R1背后的技术】系列十一:RAG原理介绍和本地部署(DeepSeekR1+RAGFlow构建个人知识库)
【DeepSeek-R1背后的技术】系列博文: 第1篇:混合专家模型(MoE) 第2篇:大模型知识蒸馏(Knowledge Distillation) 第3篇:强化学习(Reinforcement Learning, RL)…...
鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影)
鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影) 1、效果展示2、ets/pages/Home.ets3、ets/views/Home/SearchBar.ets4、ets/views/Home/NavList.ets5、ets/views/Home/TileList.ets6、ets/views/Home/PlanList.ets7、后端…...
【数据结构】B树家族详解:B树、B+树、B*
一、B树(B-Tree) 1. 定义 B树是一种平衡多路查找树,自平衡的树,能够保持数据有序,设计目标是为减少磁盘I/O次数。适用于需要频繁读写磁盘的场景(如数据库、文件系统)。 2、B树基本性质 节点键值数量限制: 对于 m 阶 B 树,根节点至少有 1 个键值,最多有 m - 1 个…...
C语言数据结构—二叉树的链式结构实现
目录 1、建立二叉树 1.1 二叉树的结构 1.2 手动建立二叉树 2、二叉树的遍历 2.1 二叉树的三种遍历方式 2.1.1 前序遍历 2.1.2 中序遍历 2.1.2 后序遍历 3、求二叉树的结点数和二叉树的高度 3.1 求二叉树结点数 3.2 求二叉树叶子结点 3.3 求二叉树第k层结点的个数 …...
Java 大视界 —— Java 大数据在智能零售动态定价策略中的应用实战(98)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
如何实现修改jvm中类的属性开源项目
根据你的需求,以下是一些可以实现类似阿里巴巴 Diamond 功能的框架和工具,这些项目可以帮助你动态推送配置信息,从而实现类似的功能: 1. Nacos Nacos 是一个更现代的动态配置服务,支持配置管理、服务发现和元数据管理…...
危化品经营单位安全管理人员的职责及注意事项
危化品经营单位安全管理人员肩负着保障经营活动安全的重要责任,以下是其主要职责及注意事项: 职责 1. 安全制度建设与执行:负责组织制定本单位安全生产规章制度、操作规程和生产安全事故应急救援预案,确保这些制度符合国家相关法…...
腾讯云大模型知识引擎×DeepSeek赋能文旅
腾讯云大模型知识引擎DeepSeek赋能文旅 ——以合肥文旅为例的技术革新与实践路径 一、技术底座:知识引擎与DeepSeek的融合逻辑 腾讯云大模型知识引擎与DeepSeek模型的结合,本质上是**“知识库检索增强生成(RAG)实时联网能力”**…...
Day 49 卡玛笔记
这是基于代码随想录的每日打卡 1143. 最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变…...
WebXR教学 01 基础介绍
什么是WebXR? 定义 XR VR AR Web上使用XR技术的API WebXR 是一组用于在 Web 浏览器中实现虚拟现实(VR)和增强现实(AR)应用的技术标准。它由 W3C 的 Immersive Web 工作组开发,旨在提供跨设备的沉浸式体验…...
DeepSeek+Kimi生成高质量PPT
DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用:生成结构化PPT大纲(擅长逻辑构建与内容优化)Kimi核心作用:将文本转换为视觉化PPT(提供模板库与排版引擎) 二、操作步骤详解 1. 通…...
hot100---day3
二叉树复习hot100专题 144. 二叉树的前序遍历 - 力扣(LeetCode) 递归法的前中后序遍历,格式比较一致; class Solution { public:vector<int>& traversal(TreeNode* root, vector<int>& ans){if(rootnullpt…...
clickhouse--表引擎的使用
表引擎决定了如何存储表的数据。包括: 数据的存储方式和位置,写到哪里以及从哪里读取数据。(默认是在安装路径下的 data 路径)支持哪些查询以及如何支持。(有些语法只有在特定的引擎下才能用)并发数据访问。索引的使用࿰…...
tauri输入js脚本的方法和注意事项initialization_script
注入js脚本最常用的就是initialization_script,通过这个方法注入的js脚本在页面每个页面都会执行,这个在tauri文档也可以搜到:WebviewWindowBuilder in tauri::webview - Rust,但是请注意,这个方法只能用在WindowBuild…...
注意力机制深度优化
###一、注意力机制深度优化 1.FlashAttentionV3(2024最新版) # 安装最新版(需H100/A100 GPU) pip install flash-attn3.0.0 --no-build-isolation# 启用FP8混合精度(需H100) model AutoModelForCausalLM.from_pretrained("…...
基于springboot的学习社区博客
一、系统架构 前端:html | bootstarp | jquery | css | ajax 后端:springboot | mybatis 环境:jdk1.8 | mysql | maven 二、代码及数据 三、功能介绍 01. web端-注册 02. web端-登录 03. web端-首页 04. web端-文章明…...
python-leetcode 42.验证二叉搜索树
题目: 给定二叉树的根节点root,判断是否是一个有效二叉搜索树 有效二叉搜索树: 1.节点的左子树只包含小于当前节点的树 2.节点的右子树只包含大于当前节点的树 3.所有左子树和右子树自身必须也是二叉搜索树 方法一:递归 如果该二叉树的…...
