当前位置: 首页 > news >正文

并发设计模式实战系列(19):监视器(Monitor)

🌟 大家好,我是摘星! 🌟

今天为大家带来的是并发设计模式实战系列,第十九章监视器(Monitor),废话不多说直接开始~

目录

一、核心原理深度拆解

1. 监视器三要素模型

2. 线程调度机制

二、生活化类比:银行柜台服务系统

三、Java代码实现(生产级Demo)

1. 完整可运行代码

2. 关键配置说明

四、横向对比表格

1. 线程同步机制对比

2. 条件变量实现对比

五、高级优化技巧

1. 锁分段优化

2. 条件变量优化

3. 监控指标扩展

4. 自适应锁优化

5. 无锁化改造方案

六、异常处理与健壮性设计

1. 死锁检测与恢复

2. 线程泄漏防护

七、分布式环境扩展

1. 跨JVM的Monitor实现

2. 多节点协同方案

八、现代Java特性整合

1. 虚拟线程适配

2. Project Loom纤程支持

九、监控指标体系建设

1. Prometheus监控集成

2. 关键监控看板

十、经典场景最佳实践

1. 数据库连接池实现

2. 生产者-消费者增强版


一、核心原理深度拆解

1. 监视器三要素模型

┌──────────────────────┐
│      Monitor Object   │
│  ┌─────────────────┐  │
│  │  Shared Data     │  │
│  └────────┬─────────┘  │
│           │            │
│  ┌────────▼─────────┐  │
│  │  Sync Methods    │  │
│  │ (Entry Queue)    │  │
│  └────────┬─────────┘  │
│           │            │
│  ┌────────▼─────────┐  │
│  │  Wait Conditions │  │
│  │ (Condition Queue)│  │
│  └─────────────────┘  │
└──────────────────────┘
  • 共享数据:被保护的临界资源(如计数器、连接池)
  • 同步方法:互斥访问入口(Java的synchronized方法/块)
  • 条件变量:线程协作机制(Object.wait()/notify()

2. 线程调度机制

  • Entry Set:竞争锁的线程队列(JVM管理)
  • Wait Set:调用wait()的线程等待区
  • 优先级控制:非公平锁(默认)vs 公平锁(按入队顺序)

二、生活化类比:银行柜台服务系统

监视器组件

银行类比

运行机制

共享数据

柜台现金

所有柜员共享同一保险箱

同步方法

柜台窗口

每次仅允许一个柜员操作现金

条件变量

客户等待区

现金不足时柜员进入等待状态

Entry Set

排队叫号机

客户按顺序获取服务资格

Wait Set

VIP休息室

特殊需求客户暂时离开主队列

  • 异常处理:柜员突发离职(线程中断)→ 系统自动唤醒下个柜员

三、Java代码实现(生产级Demo)

1. 完整可运行代码

import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class MonitorPatternDemo {// 共享资源:有限容量队列private final LinkedList<String> messageQueue = new LinkedList<>();private final int MAX_CAPACITY = 10;// 显式锁(比synchronized更灵活)private final ReentrantLock lock = new ReentrantLock(true); // 公平锁private final Condition notFull = lock.newCondition();private final Condition notEmpty = lock.newCondition();// 监视器方法:生产消息public void produce(String message) throws InterruptedException {lock.lock();try {while (messageQueue.size() == MAX_CAPACITY) {System.out.println("[Producer] 队列已满,等待消费...");notFull.await(); // 释放锁并进入等待}messageQueue.addLast(message);System.out.println("[Producer] 添加消息: " + message + " | 队列大小: " + messageQueue.size());notEmpty.signal(); // 唤醒等待的消费者} finally {lock.unlock();}}// 监视器方法:消费消息public String consume() throws InterruptedException {lock.lock();try {while (messageQueue.isEmpty()) {System.out.println("[Consumer] 队列为空,等待生产...");notEmpty.await(); // 释放锁并进入等待}String message = messageQueue.removeFirst();System.out.println("[Consumer] 处理消息: " + message + " | 剩余: " + messageQueue.size());notFull.signal(); // 唤醒等待的生产者return message;} finally {lock.unlock();}}// 监控线程public void startMonitorThread() {new Thread(() -> {while (true) {try {lock.lock();try {System.out.println("[Monitor] === 当前状态 ===");System.out.println("队列大小: " + messageQueue.size());System.out.println("等待生产者: " + lock.getWaitQueueLength(notFull));System.out.println("等待消费者: " + lock.getWaitQueueLength(notEmpty));System.out.println("=== === === === ===");} finally {lock.unlock();}TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}}}, "Monitor-Thread").start();}public static void main(String[] args) {MonitorPatternDemo monitor = new MonitorPatternDemo();monitor.startMonitorThread();// 模拟生产者for (int i = 0; i < 3; i++) {new Thread(() -> {try {while (!Thread.currentThread().isInterrupted()) {monitor.produce("Msg-" + System.currentTimeMillis());TimeUnit.MILLISECONDS.sleep(500);}} catch (InterruptedException e) {Thread.currentThread().interrupt();}}, "Producer-" + i).start();}// 模拟消费者for (int i = 0; i < 2; i++) {new Thread(() -> {try {while (!Thread.currentThread().isInterrupted()) {monitor.consume();TimeUnit.SECONDS.sleep(1);}} catch (InterruptedException e) {Thread.currentThread().interrupt();}}, "Consumer-" + i).start();}}
}

2. 关键配置说明

// 锁类型选择
new ReentrantLock(true); // 公平锁(按入队顺序获取锁)
new ReentrantLock();     // 非公平锁(默认,吞吐量更高)// 条件变量分离
private final Condition notFull = lock.newCondition();  // 队列未满条件
private final Condition notEmpty = lock.newCondition(); // 队列非空条件// 监控接口
lock.getWaitQueueLength(condition); // 获取等待特定条件的线程数

四、横向对比表格

1. 线程同步机制对比

机制

互斥能力

条件等待

可中断

公平性

适用场景

synchronized

单一条件

不可

非公平

简单同步场景

ReentrantLock

多条件

可中断

可配置

复杂同步逻辑

Semaphore

可中断

可配置

资源池控制

ReadWriteLock

多条件

可中断

可配置

读多写少场景

2. 条件变量实现对比

实现方式

通知精度

批量唤醒

超时支持

使用复杂度

Object.wait()

全部

Condition.await()

指定条件

BlockingQueue

内置

自动


五、高级优化技巧

1. 锁分段优化

// 降低锁粒度(如ConcurrentHashMap的分段锁思想)
private final ReentrantLock[] segmentLocks = new ReentrantLock[16];
{for (int i = 0; i < segmentLocks.length; i++) {segmentLocks[i] = new ReentrantLock();}
}public void put(String key, String value) {int segment = Math.abs(key.hashCode() % segmentLocks.length);segmentLocks[segment].lock();try {// 操作对应分段的共享数据} finally {segmentLocks[segment].unlock();}
}

2. 条件变量优化

// 使用带超时的等待(避免死锁)
if (!notEmpty.await(5, TimeUnit.SECONDS)) {throw new TimeoutException("等待消息超时");
}// 使用signalAll()谨慎(可能引起"惊群效应")
notEmpty.signal(); // 优先使用精准通知

3. 监控指标扩展

// 添加JMX监控(示例)
public class MonitorMetrics implements MonitorMetricsMBean {private final ReentrantLock lock;public int getWaitThreadCount() {return lock.getQueueLength(); // 获取等待锁的线程数}public int getActiveThreadCount() {return lock.getHoldCount(); // 获取锁重入次数}
}// 注册MBean
ManagementFactory.getPlatformMBeanServer().registerMBean(new MonitorMetrics(lock), new ObjectName("com.example:type=MonitorMetrics")
);

4. 自适应锁优化

// 根据竞争情况动态切换锁类型
public class AdaptiveLock {private volatile boolean highContention = false;private final ReentrantLock fairLock = new ReentrantLock(true);private final ReentrantLock unfairLock = new ReentrantLock();public void lock() {if (highContention) {fairLock.lock(); // 高竞争时用公平锁} else {unfairLock.lock(); // 默认非公平锁}}// 监控线程竞争情况public void monitor() {new Thread(() -> {while (true) {int waiters = fairLock.getQueueLength() + unfairLock.getQueueLength();highContention = waiters > 5; // 阈值可配置try { Thread.sleep(1000); } catch (InterruptedException e) { break; }}}).start();}
}

5. 无锁化改造方案

// 对读多写少场景使用原子变量
private final AtomicReference<Map<String, String>> cache = new AtomicReference<>(new ConcurrentHashMap<>());public void updateCache(String key, String value) {while (true) {Map<String, String> oldMap = cache.get();Map<String, String> newMap = new ConcurrentHashMap<>(oldMap);newMap.put(key, value);if (cache.compareAndSet(oldMap, newMap)) break;}
}

六、异常处理与健壮性设计

1. 死锁检测与恢复

// 使用ThreadMXBean检测死锁
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
long[] threadIds = bean.findDeadlockedThreads();
if (threadIds != null) {ThreadInfo[] infos = bean.getThreadInfo(threadIds);for (ThreadInfo info : infos) {System.err.println("死锁线程: " + info.getThreadName());// 强制中断受害线程(生产环境需谨慎)Thread thread = findThreadById(info.getThreadId());if (thread != null) thread.interrupt();}
}

2. 线程泄漏防护

// 封装安全的线程池
public class SafeExecutor extends ThreadPoolExecutor {private final ConcurrentMap<Worker, Boolean> workers = new ConcurrentHashMap<>();protected void beforeExecute(Thread t, Runnable r) {workers.put((Worker) t, true);}protected void afterExecute(Runnable r, Throwable t) {workers.remove(Thread.currentThread());}public List<Thread> getStuckThreads(long timeoutMs) {return workers.keySet().stream().filter(w -> w.getActiveTime() > timeoutMs).collect(Collectors.toList());}
}

七、分布式环境扩展

1. 跨JVM的Monitor实现

// 基于Redis的分布式锁
public class DistributedMonitor {private final Jedis jedis;private final String lockKey;public boolean tryLock(long timeoutMs) {String result = jedis.set(lockKey, "locked", "NX", "PX", timeoutMs);return "OK".equals(result);}public void unlock() {jedis.del(lockKey);}// 使用Redisson的看门狗机制实现续期public void startWatchdog() {new Thread(() -> {while (locked) {jedis.expire(lockKey, 30);try { Thread.sleep(10000); } catch (InterruptedException e) { break; }}}).start();}
}

2. 多节点协同方案

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│   Node 1    │    │   Node 2    │    │   Node 3    │
│ ┌─────────┐ │    │ ┌─────────┐ │    │ ┌─────────┐ │
│ │ Monitor │───ZK─▶│ Monitor │───ZK─▶│ Monitor │ │
│ └─────────┘ │    │ └─────────┘ │    │ └─────────┘ │
└─────────────┘    └─────────────┘    └─────────────┘
  • ZooKeeper协调:通过临时节点实现Leader选举
  • 状态同步:使用Watcher机制通知条件变更

八、现代Java特性整合

1. 虚拟线程适配

// JDK21+ 虚拟线程优化
ExecutorService vThreadPool = Executors.newVirtualThreadPerTaskExecutor();public void virtualThreadMonitor() {try (var executor = vThreadPool) {executor.submit(() -> {synchronized(this) { // 兼容传统synchronizedwhile (conditionNotMet()) {wait(); // 虚拟线程挂起时不占用OS线程}// 处理共享数据}});}
}

2. Project Loom纤程支持

// 使用Fiber替代线程(实验性)
new Fiber<Void>(() -> {LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));synchronized(lock) { // 百万级纤程共享Monitor// 业务逻辑}
}).start();

九、监控指标体系建设

1. Prometheus监控集成

// 暴露锁竞争指标
Gauge contentionGauge = Gauge.build().name("monitor_lock_contention").help("Current lock waiters count").register();public void recordMetrics() {new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(() -> {contentionGauge.set(lock.getQueueLength());}, 0, 5, TimeUnit.SECONDS);
}

2. 关键监控看板

指标名称

计算方式

健康阈值

锁等待时间

历史平均等待时间

< 50ms

条件变量等待数

notEmpty.getWaitQueueLength

< CPU核心数×2

死锁检测次数

ThreadMXBean统计

= 0

线程活跃度

活跃线程数/最大线程数

60%~80%


十、经典场景最佳实践

1. 数据库连接池实现

public class ConnectionPool {private final LinkedList<Connection> pool = new LinkedList<>();private final int maxSize;private final Object monitor = new Object();public Connection borrow() throws InterruptedException {synchronized (monitor) {while (pool.isEmpty()) {monitor.wait();}return pool.removeFirst();}}public void release(Connection conn) {synchronized (monitor) {pool.addLast(conn);monitor.notify();}}
}

2. 生产者-消费者增强版

// 支持优先级和批量处理
public class EnhancedBlockingQueue {private final PriorityBlockingQueue<Item> queue;private final Semaphore available;public void putBatch(List<Item> items) {queue.addAll(items);available.release(items.size());}public Item take() throws InterruptedException {available.acquire();return queue.poll();}
}

相关文章:

并发设计模式实战系列(19):监视器(Monitor)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第十九章监视器&#xff08;Monitor&#xff09;&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 监视器三要素模型 2. 线程调度…...

Oracle Fusion常用表

模块表名表描述字段说明sodoo_headers_all销售订单头表sodoo_lines_all销售订单行表sodoo_fulfill_lines_all销售订单明细行表popo_headers_all采购订单头表popo_lines_all采购订单行表popo_line_locations_all采购订单分配表popo_distributions_all采购订单发运表invEGP_SYSTE…...

虚假AI工具通过Facebook广告传播新型Noodlophile窃密木马

网络安全公司Morphisec的研究人员发现&#xff0c;攻击者正利用虚假人工智能&#xff08;AI&#xff09;平台传播名为Noodlophile Stealer的新型信息窃取木马。这种复杂攻击手法利用AI工具的热度诱骗用户下载恶意软件&#xff0c;窃取浏览器凭证、加密货币钱包&#xff0c;并可…...

华为云Flexus+DeepSeek征文|从开通到应用:华为云DeepSeek-V3/R1商用服务深度体验

前言 本文章主要讲述在华为云ModelArts Studio上 开通DeepSeek-V3/R1商用服务的流程&#xff0c;以及开通过程中的经验分享和使用感受帮我更多开发者&#xff0c;在华为云平台快速完成 DeepSeek-V3/R1商用服务的开通以及使用入门注意&#xff1a;避免测试过程中出现部署失败等问…...

在Cline上调用MCP服务之MCP实践篇

目录 引言一、准备工作1、安装 Visual Studio Code2、安装Cline插件配置支持模型 二、安装MCP Server并调用MCP Server三、本地手动安装MCP Server结尾 引言 上一篇《模型上下文协议&#xff08;Model Context Protocol&#xff0c;MCP&#xff09;初见概念篇》我们说到什么是…...

大模型应用开发之模型架构

一、Transformer 架构 1. 编码器Encoder&#xff08;“阅读理解大师”&#xff09; 1&#xff09;核心任务&#xff1a;编码器的唯一目标就是彻底理解输入的句子。它要把输入的每个词&#xff08;或者说词元 Token&#xff09;都转化成一个充满上下文信息的“向量表示”&#…...

敦普水性无铬锌铝涂层:汽车紧固件防锈15年,解决螺栓氢脆腐蚀双痛点

汽车紧固件低能耗涂装 在汽车工业体系中&#xff0c;紧固件承担着连接关键部件的重任。螺栓的抗拉强度、螺母的锁紧力矩&#xff0c;直接决定着整车的可靠性。当前&#xff0c;传统涂层技术始终面临一道难题&#xff1a;如何在保障防锈性能的同时&#xff0c;实现真正的环保无有…...

基环树(模板) 2876. 有向图访问计数

对于基环树&#xff0c;我们可以通过拓扑排序去掉所有的树枝&#xff0c;只剩下环&#xff0c;题目中可能会有多个基环树 思路&#xff1a;我们先利用拓扑排序将树枝去掉&#xff0c;然后求出每个基环树&#xff0c;之后反向dfs求得所有树枝的长度即可 class Solution { publi…...

26考研——中央处理器_指令执行过程(5)

408答疑 文章目录 二、指令执行过程指令周期定义指令周期的多样性指令执行的过程注意事项 指令周期的数据流取指周期间址周期执行周期中断周期 指令执行方案单周期处理器多周期处理器流水线处理器 八、参考资料鲍鱼科技课件26王道考研书 九、总结 二、指令执行过程 指令周期 …...

Unity基础学习(九)输入系统全解析:鼠标、键盘与轴控制

目录 一、Input类 1. 鼠标输入 2. 键盘输入 3. 默认轴输入 &#xff08;1&#xff09; 基础参数 &#xff08;2&#xff09;按键绑定参数 &#xff08;3&#xff09;输入响应参数 &#xff08;4&#xff09;输入类型与设备参数 &#xff08;5&#xff09;不同类型轴的参…...

如何清除windows 远程桌面连接的IP记录

问题 在远程桌面连接后&#xff0c;会在输入列表留下历史IP记录&#xff0c;无用的IP多了会影响我们查找效率&#xff0c;也不安全。 现介绍如何手动删除这些IP记录。 解决方案 1、打开注册表 按 Win R&#xff0c;输入 regedit&#xff0c;回车定位到远程桌面记录的注册表…...

C#参数数组全解析

在C#编程中&#xff0c;参数数组是一个重要的概念&#xff0c;它为方法调用提供了更大的灵活性。下面我们将详细介绍参数数组的相关内容。 参数数组的基本规则 在本书所述的参数类型里&#xff0c;通常一个形参需严格对应一个实参&#xff0c;但参数数组不同&#xff0c;它允…...

设计模式-策略模式(Strategy Pattern)

设计模式-策略模式&#xff08;Strategy Pattern&#xff09; 一、概要 在软件设计中&#xff0c;策略模式&#xff08;Strategy Pattern&#xff09;是一种非常重要的行为型设计模式。它的核心思想是将算法或行为封装在不同的策略类中&#xff0c;使得它们可以互换&#xff…...

LeetCode面试题 17.21 直方图的水量

题目 解答 package leetcode.editor.cn;//leetcode submit region begin(Prohibit modification and deletion) class Solution {public int trap(int[] height) {int length height.length;if (length 0) {return 0;}int[] leftMax new int[length];leftMax[0] 0;for (i…...

数据库系统概论(七)初识SQL与SQL基本概念

数据库系统概论&#xff08;七&#xff09;初识SQL与SQL基本概念 前言一、什么是SQL语言&#xff1f;1.1 SQL的产生和发展1.2 SQL的特点1.3 SQL的基本概念1.3.1 数据库相关“术语”&#xff08;类比Excel表格&#xff09;1.3.2 四大类核心语句&#xff08;后面会详细讲&#xf…...

Jenkins Maven 带权限 搭建方案2025

1、使用docker搭建jenkins version: 3.8services:jenkins:image: jenkins_lzh:1.0container_name: jenkinsports:- "8080:8080" # Jenkins Web UI- "50000:50000" # Jenkins Agent通信端口volumes:- ./jenkins_home:/var/jenkins_home # 持久化Jenkins…...

服务器配置错误导致SSL/TLS出现安全漏洞,如何进行排查?

SSL/TLS 安全漏洞排查与修复指南 一、常见配置错误类型‌ 弱加密算法与密钥问题‌ 使用弱密码套件&#xff08;如DES、RC4&#xff09;或密钥长度不足&#xff08;如RSA密钥长度<2048位&#xff09;&#xff0c;导致加密强度不足。 密钥管理不当&#xff08;如私钥未加密存…...

【高并发】Celery + Redis异步任务队列方案提高OCR任务时的并发

线程池处理OCR仍然会阻塞请求的原因主要有以下几点&#xff0c;以及为什么CeleryRedis是更好的解决方案&#xff1a; 1. 线程池的阻塞本质 请求-响应周期未分离&#xff1a;即使使用线程池&#xff0c;HTTP请求仍需要等待线程池任务完成才能返回响应。当所有线程都繁忙时&#…...

c/c++的Libevent 和OpenSSL构建HTTPS客户端详解(附带源码)

使用 Libevent 和 OpenSSL 构建 HTTPS 客户端详解 在现代网络应用中&#xff0c;HTTPS 协议的普及使得安全通信成为标配。Libevent 是一个功能强大且广泛应用的事件通知库&#xff0c;能够帮助开发者编写高性能、可移植的网络程序。然而&#xff0c;libevent 本身并不直接处理…...

关于fastjson与fastjson2中toJava操作的区别

关于fastjson与fastjson2中toJava操作的区别 一、场景二、 区别1、前置条件2、对比1. fastjson2. fastjson2 三、解决方案 一、场景 在Java中会有将json转为实体类的需求&#xff0c;其中fastjson是一个常用的选择&#xff0c;今天在升级项目依赖的过程中&#xff0c;将fastjs…...

PX4开始之旅(二)通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信

核心知识点&#xff1a;通过自定义 MAVLink 消息与 QGroundControl (QGC) 通信 1. 通俗易懂的解释 想象一下&#xff0c;MAVLink 就像是无人机&#xff08;飞控&#xff09;和地面站&#xff08;QGroundControl&#xff09;之间约定好的一种“语言”。这种语言有很多标准的“…...

Docker组件详解:核心技术与架构分析

Docker详解&#xff1a;核心技术与架构分析 Docker作为一种容器化技术&#xff0c;已经彻底改变了软件的开发、交付和部署方式。要充分理解和利用Docker的强大功能&#xff0c;我们需要深入了解其核心组件以及它们如何协同工作。本文将详细介绍Docker的主要组件、架构设计以及…...

uni-app,小程序中的addPhoneContact,保存联系人到手机通讯录

文章目录 方法详解简介 基本语法参数说明基础用法使用示例平台差异说明注意事项最佳实践 方法详解 简介 addPhoneContact是uni-app框架提供的一个实用API&#xff0c;用于向系统通讯录添加联系人信息。这个方法在需要将应用内的联系人信息快速保存到用户设备通讯录的场景下非…...

uniapp小程序轮播图高度自适应优化详解

在微信小程序开发过程中&#xff0c;轮播图组件(swiper)是常用的UI元素&#xff0c;但在实际应用中经常遇到高度不匹配导致的空白问题。本文详细记录了一次轮播图高度优化的完整过程&#xff0c;特别是针对固定宽高比图片的精确适配方案。 问题背景 在开发"零工市场&quo…...

赛季7靶场 - Environment

本系列仅说明靶场的攻击思路&#xff0c;不会给出任何的详细代码执行步骤&#xff0c;因为个人觉得找到合适的工具以实现攻击思路的能力也非常重要。 1.Nmap扫描发现80和22端口 2.访问80端口&#xff0c;使用katana查看js代码&#xff0c;快速发现laravel框架。 【*】希望知道…...

JVM——即时编译

分层编译模式&#xff1a;动态平衡启动速度与执行效率 分层编译是现代JVM&#xff08;如HotSpot、GraalVM&#xff09;实现高性能的核心策略之一&#xff0c;其核心思想是根据代码的执行热度动态选择不同的编译层次&#xff0c;实现启动速度与运行效率的最佳平衡。以HotSpot虚…...

武汉火影数字|数字科技馆打造:开启科技探索新大门

足不出户&#xff0c;就能畅游科技的奇幻世界&#xff0c;你相信吗&#xff1f;数字科技馆就能帮你实现&#xff01;在这个数字化的时代&#xff0c;数字科技馆如同一颗璀璨的新星&#xff0c;照亮了我们探索科学的道路。 那么&#xff0c;数字科技馆究竟是什么呢&#xff1f; …...

升级 Azure Kubernetes 服务群集的关键注意事项

升级 Azure Kubernetes 服务 (AKS) 集群不仅是为了保持最新状态&#xff0c;更是为了保护您的工作负载、提升性能并降低运营风险。但如果操作不当&#xff0c;可能会导致停机、工作负载中断&#xff0c;甚至访问问题。 在本指南中&#xff0c;我们将介绍&#xff1a; 生产环境…...

数据类型详解(布尔值、整型、浮点型、字符串等)-《Go语言实战指南》

Go语言是一门静态强类型语言&#xff0c;所有变量在编译时必须明确其数据类型。本章将详细介绍Go的基础数据类型&#xff0c;帮助你理解并正确使用它们。 一、数据类型分类总览 Go 的基础数据类型可以分为以下几类&#xff1a; 类型分类代表类型示例布尔类型booltrue, false整…...

单片机-STM32部分:9-1、触控检测芯片

飞书文档https://x509p6c8to.feishu.cn/wiki/ILBsw4EaQiWaUukWrxEcO4XZnXc 传统物理按键 原理 玻璃盖板下通过一个触摸PAD连接到触摸芯片中&#xff0c;触摸PAD可以用PCB铜箔、金属片、平顶圆柱弹簧、导电棉、导电油墨、导电橡胶、导电玻璃的ITO层等。 当有人体手指靠近触摸按…...

从 JMS 到 ActiveMQ:API 设计与扩展机制分析(二)

&#xff08;三&#xff09;消息结构与 API 操作 JMS 消息结构&#xff1a;JMS 消息主要由消息头&#xff08;Header&#xff09;、属性&#xff08;Properties&#xff09;和消息体&#xff08;Body&#xff09;三部分组成。消息头包含了许多预定义的字段&#xff0c;用于标识…...

CSS display: none

在 CSS 中&#xff0c;display: none; 是一个用于控制元素显示与隐藏的属性值&#xff0c;其核心作用是完全从文档流中移除元素&#xff0c;使元素在页面中不占据任何空间&#xff0c;也不会被渲染。以下是详细解释&#xff1a; 核心作用 隐藏元素&#xff1a;使元素在页面中…...

vison transformer vit 论文阅读

An Image is Worth 16x16 Words 20年的论文看成10年的哈斯我了 [2010.11929] 一张图像胜过 16x16 个单词&#xff1a;用于大规模图像识别的转换器 --- [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 为什么transformer好训练&am…...

dropout层

从你提供的图片来看&#xff0c;里面讨论了 Dropout 层&#xff0c;让我为你解释一下它的工作原理和作用。 Dropout 层是什么&#xff1f; Dropout 是一种常用的正则化技术&#xff0c;用于避免神经网络的 过拟合&#xff08;overfitting&#xff09;。过拟合是指模型在训练数…...

openssl中BIO的使用

BIO是OpenSSL的一个重要的结构和概念&#xff0c;是对数据IO与传递处理的一种类型抽象和功能封装&#xff0c;这里所说的数据IO与传递的“介质”包括&#xff1a;内存、文件、日志、标准设备、网络socket等&#xff0c;“处理”包括简单、加/解密、摘要、ssl协议下的读/写等的数…...

电动汽车充电设施可调能力聚合评估与预测

电动汽车充电设施可调能力聚合评估与预测 项目概述 本项目基于论文《大规模电动汽车充换电设施可调能力聚合评估与预测》(鲍志远&#xff0c;胡泽春)&#xff0c;实现了电动汽车充电设施可调能力的聚合评估与预测方法。 主要文件 real_data_model.m: 使用真实数据实现LSTM线…...

Git clone时出现SSL certificate problem unable to get local issuer certificate

正确解决方法 git config --global http.sslVerify false错误解决方法&#xff1a;&#xff08;主要是看错了嘿嘿&#xff0c;但是如果是 OpenSSL SSL_read: Connection was reset, errno 10054 Failed to connect to github.com port 443: Timed out 原…...

requests库

模拟请求获取网页源代码 如下 import requestsr requests.get(https://spa1.scrape.center/page/1) print(r.text) 源码如下 GET请求 示例网站为 https://httpbin.org import requests r requests.get(https://httpbin.org/) print(r.text) 所显示的结果如下 {"a…...

基于springboot的海洋环保知识分享系统的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…...

安科瑞ADL3000-E-A/KC三相交流电能表CE认证导轨表

1 概述 ADL3000-E-A 是一款为供电系统、工矿企业以及公用事业单位设计的智能电表&#xff0c;用于计算耗电量并管理用电需求。它具备高精度、体积小以及安装简便的特点。它将所有电气参数的测量与综合电能计量及管理功能集成在一起&#xff0c;可提供过去 12 个月的各类数据&a…...

红黑树算法笔记

文章目录 红黑树 (Red-Black Tree) 学习笔记0. 节点结构与哨兵节点1. 什么是红黑树&#xff1f;2. 红黑树的五个核心性质3. 为什么需要红黑树&#xff1f;4. 红黑树的基本操作a. 查找 (Search)b. 插入 (Insert)c. 删除 (Delete) 5. 维护平衡的关键操作a. 变色 (Recoloring)b. 旋…...

【Axios】解决Axios下载二进制文件返回空对象的问题

【Axios】解决Axios下载二进制文件返回空对象的问题 问题背景 在一个基于Vue 3的项目中,我们使用Axios下载Excel文件,但遇到了一个奇怪的问题:文件能成功下载下来,但打开时显示内容为[object Object]无法使用。 当我们执行下载代码: const response = await downloadT…...

2.MySQL数据库操作

一.MySQL数据库介绍 数据库目前标准指令集是SQL&#xff0c;即结构化查询语言。SQL语言主要由以下几部分组成 DDL&#xff08;数据定义语言&#xff09;&#xff1a;用来建立数据库、数据库对象和定义字段&#xff0c;如create、alter、drop。 DML&#xff08;数据操纵语言&…...

01.three官方示例+编辑器+AI快速学习webgl_animation_keyframes

实例&#xff1a;examples/webgl_animation_keyframes.html 在这里插入图片描述 重点关注&#xff1a; AnimationMixer&#xff1a;管理模型的所有动画AnimationClip&#xff1a;表示一个完整的动画ClipAction&#xff1a;控制动画的播放状态&#xff08;播放、暂停、速度等&am…...

在 Spring Boot 中实现动态线程池的全面指南

动态线程池是一种线程池管理方案&#xff0c;允许在运行时根据业务需求动态调整线程池参数&#xff08;如核心线程数、最大线程数、队列容量等&#xff09;&#xff0c;以优化资源利用率和系统性能。在 Spring Boot 中&#xff0c;动态线程池可以通过 Java 的 ThreadPoolExecut…...

餐饮行业新风口:上门厨师服务系统的技术实现路径

上门做饭正在成为下一个万亿级风口&#xff01;当外卖平台被预制菜攻陷&#xff0c;当年轻人对着料理包无可奈何&#xff0c;一个全新的餐饮模式正在悄然崛起。 我们的市场调研显示&#xff0c;83%的消费者无法分辨外卖是否使用预制菜&#xff0c;76%的年轻人愿意为透明烹饪过程…...

odoo-049 Pycharm 中 git stash 后有pyc 文件,如何删除pyc文件

文章目录 问题描述解决思路正确的去除 git 跟踪 pyc文件的做法 问题描述 查看本地 stash 列表 stash 后有很多 pyc 文件都被 git 追踪了&#xff0c;这样不合理&#xff0c;而且等 unstash 的时候就会有问题 解决思路 尝试方法&#xff1a; 递归地删除指定文件夹及其子目录中…...

线程同步机制

synchronized 实现线程同步的关键字&#xff0c;用来防止多个线程同时访问某个代码块或方法&#xff0c;避免并发冲突和数据不一致。通过持有一把唯一的对象锁&#xff0c;谁拿到了谁就能执行&#xff0c;谁没拿到只能等待锁释放。 1. 修饰实例方法&#xff08;锁当前实例&…...

YOLO目标检测算法

文章目录 前言一、目标检测算法简介1、传统目标检测算法&#xff08;1&#xff09;R-CNN算法简介&#xff08;2&#xff09;Fast R-CNN算法简介&#xff08;3&#xff09;Faster R-CNN算法简介 2、目标检测中的算法设计范式&#xff08;1&#xff09;one-stage&#xff08;2&am…...

【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门

比赛传送门&#xff1a; 本场比赛开始时题面存在一些问题&#xff0c;私密马赛&#xff01; A.池化【入门教育赛】 根据题目所给公式计算即可。 #include "bits/stdc.h"signed main() {int t; std::cin >> t;while (t --) {int l, k, s, p; std::cin >&…...