【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别
我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行
wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒,sleep能被interrupt提前唤醒
我们使用wait大多是不知道要等多少时间的前提下使用的,我们的所谓的超时时间其实是用来兜底的,大多数情况下,wait是再超时时间之内就被唤醒了,比如我们设置的超时时间是1000ms,大多数的情况我们100ms或者200ms就提前唤醒了,只有小于1%的情况才会触发超时
使用sleep,一定是知道要等多少时间的情况下使用的,虽然可以被提前唤醒,但是通过异常的方式唤醒,这个操作不应该作为正常的业务流程,比如我们sleep了1000ms,大多数的情况下我们是期望1000ms是准时的,被异常唤醒只少数的极端情况,sleep的唤醒是通过异常的方式,正常的业务逻辑不应该依赖于异常的处理,异常的处理我们认为是在做一些补救的措施
多线程代码案例
单例模式
单里模式是一种设计模式
什么是设计模式呢?
设计模式和框架都是程序员需要掌握的技能,只不过框架是硬性的规定,而设计模式是软性的规定,这些都是大佬设计出来的,即使是一个代码写的不好的程序员根据这些写代码也能写出还可以的代码,遵守设计模式,代码的下限就被兜住了,设计模式就像棋谱一样,按照棋谱来走的话,你下的棋不会很差,但是你不一定非要按照棋谱的方式来下棋,也许你下棋会比棋谱很好
设计模式有很多种,不同的语言当中,也有不同的设计模式(设计模式也可以认为是对编程语言语法的补充)
单例模式:单例就是单个实例(对象),某个类在进程中,只应该创建出一个实例(原则上不应该有多个),使用单例模式就可以对咱们的代码进行一个更严格的校验和检查,比如,有时候代码中我们用一个对象来管理/持有大量的数据,我们只需要这一个对象就可以了,假设这个对象管理了10G的数据,如果我们不小多创建出来几个对象的话,内存空间就就会成倍的增长,我们的机器就可能顶不住
如何保证对象的唯一性呢?
我们可以搞一个“君子协议”,写一个文档,文档上面规定只能有一个对象,每个接手的程序员都要遵守这个文档,不能将这个类创建多个实例,但是这种约定是不靠谱的,Java本身的语法并没有规定一个类可以创建多少个对象,于是我们就要通过一些“奇淫巧计”来实现这样的效果
实现单例模式的方式有很多种的,这里我们介绍最基础的实现方式:
1.饿汉模式
2.懒汉模式
饿汉模式
我们现在写一个Singleton类,我们要求这个类只能有拥有唯一的实例
上图的这个实例就是我们希望创建出的唯一的实例
为什么这就是唯一的呢?
我们注意到我们这个实例前面添加了static,就是静态的意思,也可以理解为是类属性,所以我们这一个实例是属于类对象里面的属性,我们知道每个类的类对象只有一个,所以我们的类属性自然也是只有一个了,此时instanc指向的这个对象就是唯一的一个对象了
其他的代码要是想要获取这个类的实例的话,就要通过这个方法来进行获取,不应该通过new再获取新的对象,而是通过这个方法获取到现成的对象
我们直接将构造方法设置为私有的就保证了其他代码不能在new一个对象,只能调用getInstance方法来获取实例(如下图)
SIngleton内部已经将唯一的实例给准备好了,在其他的代码种即使是有人搞错了直接new一个新对象,也不会出现错误
如上图的代码,结果打印出来是true,证明我们两次获取的是同一个对象,也就说明了Singleton类的对象是唯一的
上述代码,称为”饿汉模式“,是单例模式中一种简单的写法,所谓的“饿”形容非常的迫切,实例是在类被加载的时候就被创建了,创建的时机非常的早,相当于程序一启动,实例就创建了,就用“饿汉”来形容创建的实际非常的早,非常的迫切
能不能用反射调用到这个构造方法?
用反射是可以的,反射属于非常规手段,但是用枚举实现的单例模式是不能用反射破解的
懒汉模式
创建实例的实际不一样了,创建实例的机会会更晚,只有第一次使用的时候才会创建实例
“懒”这个词不是贬义词,而是褒义词,我们的社会进步,效率生产力提高其实是因为“懒”,所以在计算机里“懒”通常代表着更高的效率
比如有有一个非常大的文件(10G),如果现在又一个编辑器想要打开这个文件的话,如果按照“饿汉”的方式就是一次性的将10G的文件加载到内存,然后再进行统一的展示,一次性加载10G的数据就会很耗费时间,而且一次性加载了这么多的数据,用户一次性也看不完,如果是按照“懒汉”的方式来的话,编辑器只会先读取一小部分的数据,比如说10KB,先把这些展示给用户,之后用户通过翻页等操作,再继续读取后面的数据,加载10KB的数据就是一瞬间事情
懒汉模式的代码如上,但是此时这个代码里面还有很多问题,我们下一篇文章将会讲到
相关文章:

【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...

VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上
一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema,不需要复杂的查询,只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 :在几秒钟…...
StarRocks 全面向量化执行引擎深度解析
StarRocks 全面向量化执行引擎深度解析 StarRocks 的向量化执行引擎是其高性能的核心设计,相比传统行式处理引擎(如MySQL),性能可提升 5-10倍。以下是分层拆解: 1. 向量化 vs 传统行式处理 维度行式处理向量化处理数…...
SQL进阶之旅 Day 22:批处理与游标优化
【SQL进阶之旅 Day 22】批处理与游标优化 文章简述(300字左右) 在数据库开发中,面对大量数据的处理任务时,单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”,深入探讨如何通过批量操作和游标技术提…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...

表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...

Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...

工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...

鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...

CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...