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

【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十六章 多线程:从pthread到JMM的升维

一、并发编程的范式革命

1.1 C多线程的刀耕火种

C语言通过POSIX线程(pthread)实现并发,需要开发者直面底层细节:

典型pthread实现

#include <pthread.h>  int counter = 0;  
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;  void* increment(void* arg) {  for (int i = 0; i < 1000000; i++) {  pthread_mutex_lock(&lock);  counter++;  pthread_mutex_unlock(&lock);  }  return NULL;  
}  int main() {  pthread_t t1, t2;  pthread_create(&t1, NULL, increment, NULL);  pthread_create(&t2, NULL, increment, NULL);  pthread_join(t1, NULL);  pthread_join(t2, NULL);  printf("Final counter: %d\n", counter); // 应为2000000  
}  

内存可见性陷阱

// 无内存屏障的危险代码  
int flag = 0;  
int data = 0;  void* writer(void* arg) {  data = 42;          // 可能被重排序  flag = 1;  return NULL;  
}  void* reader(void* arg) {  while (flag != 1);  // 可能死循环  printf("%d\n", data);  return NULL;  
}  

C并发的四大困境

  1. 手动管理线程生命周期(创建/销毁)
  2. 显式同步原语(互斥锁/条件变量/信号量)
  3. 内存可见性依赖硬件架构(x86/ARM差异)
  4. 难以调试的竞态条件和死锁
1.2 Java线程的现代武器库

等效Java实现

public class Counter {  private int count = 0;  private final Object lock = new Object();  public void increment() {  synchronized(lock) {  count++;  }  }  public static void main(String[] args) throws InterruptedException {  Counter counter = new Counter();  Thread t1 = new Thread(() -> {  for (int i = 0; i < 1_000_000; i++) counter.increment();  });  Thread t2 = new Thread(t1.getRunnable());  t1.start();  t2.start();  t1.join();  t2.join();  System.out.println(counter.count); // 精确输出2000000  }  
}  

Java并发优势矩阵

维度pthreadJava并发模型
线程创建显式管理描述符Thread/Runnable自动封装
同步机制手动锁/条件变量synchronized/Lock API
内存可见性依赖硬件和volatileJMM严格规范
高级抽象需自行实现线程池Executor框架内置
调试支持GDB艰难排查JConsole/VisualVM可视化
1.3 从物理线程到虚拟线程

Java 21虚拟线程革命

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {  for (int i = 0; i < 10_000; i++) {  executor.submit(() -> {  Thread.sleep(Duration.ofSeconds(1));  return 42;  });  }  
} // 自动管理数万个轻量级线程  

与传统线程对比

指标平台线程虚拟线程
内存开销~1MB/线程~200KB/线程
创建速度毫秒级微秒级
上下文切换内核调度用户态调度
最大数量数千数百万

二、synchronized的Monitor实现

2.1 C互斥锁的局限性

pthread_mutex问题分析

pthread_mutex_t mutex;  
pthread_mutex_init(&mutex, NULL);  void critical_section() {  pthread_mutex_lock(&mutex);  // 临界区代码  pthread_mutex_unlock(&mutex);  
}  

缺陷列表

  • 不支持可重入(递归锁需特殊属性)
  • 无等待超时机制
  • 无法跨进程同步
  • 性能问题(内核态切换开销)
2.2 Java对象头的秘密

Mark Word内存布局(64位JVM):

| 锁状态       | 61位信息                  |  
|-------------|--------------------------|  
| 无锁         | 哈希码 + 分代年龄           |  
| 偏向锁        | 线程ID + epoch + 分代年龄   |  
| 轻量级锁      | 指向栈中锁记录的指针          |  
| 重量级锁      | 指向Monitor的指针           |  
| GC标记       | 标记位 + 其他GC信息          |  

锁升级过程

  1. 初始无锁状态
  2. 单线程访问→偏向锁(记录线程ID)
  3. 多线程轻度竞争→轻量级锁(CAS自旋)
  4. 激烈竞争→重量级锁(操作系统互斥)
2.3 Monitor的C语言模拟

Java Monitor模型实现

typedef struct {  pthread_mutex_t mutex;  pthread_cond_t cond;  int entry_count;      // 重入计数  void* owner;          // 持有线程  
} Monitor;  void monitor_enter(Monitor* monitor) {  pthread_mutex_lock(&monitor->mutex);  while (monitor->owner != NULL && monitor->owner != pthread_self()) {  pthread_cond_wait(&monitor->cond, &monitor->mutex);  }  monitor->owner = pthread_self();  monitor->entry_count++;  pthread_mutex_unlock(&monitor->mutex);  
}  void monitor_exit(Monitor* monitor) {  pthread_mutex_lock(&monitor->mutex);  if (--monitor->entry_count == 0) {  monitor->owner = NULL;  pthread_cond_signal(&monitor->cond);  }  pthread_mutex_unlock(&monitor->mutex);  
}  

与Java的差异

  • 手动管理锁状态
  • 缺少偏向锁优化
  • 无自适应自旋策略

三、volatile与内存屏障

3.1 C的volatile局限性

C volatile的误解

volatile int flag = 0;  void* writer(void* arg) {  data = 42;  flag = 1;  // 不保证内存顺序!  return NULL;  
}  void* reader(void* arg) {  while (flag == 0);  printf("%d\n", data); // 可能看到0  
}  

C11内存模型补救

_Atomic int flag = 0;  void writer() {  data = 42;  atomic_store_explicit(&flag, 1, memory_order_release);  
}  void reader() {  while (atomic_load_explicit(&flag, memory_order_acquire) == 0);  printf("%d\n", data);  
}  
3.2 Java volatile的严格语义

JMM保证

  1. 可见性:写操作对后续读可见
  2. 顺序性:禁止指令重排序
  3. 原子性:long/double的原子访问

内存屏障实现

StoreStore屏障  
volatile写  
StoreLoad屏障  LoadLoad屏障  
volatile读  
LoadStore屏障  
3.3 缓存一致性协议

MESI状态转换

  • Modified(已修改)
  • Exclusive(独占)
  • Shared(共享)
  • Invalid(无效)

Java volatile写操作

  1. 将缓存行置为Modified
  2. 通过总线嗅探使其他核心缓存失效
  3. 强制刷新到主内存

四、JMM:并发世界的宪法

4.1 顺序一致性幻觉破灭

代码示例

int x = 0, y = 0;  // 线程1  
x = 1;  
int r1 = y;  // 线程2  
y = 1;  
int r2 = x;  

可能结果

  • (r1=0, r2=0) → 违反直觉但合法
  • 编译器和CPU的重排序导致
4.2 Happens-Before规则

八大原则

  1. 程序顺序规则
  2. 监视器锁规则
  3. volatile变量规则
  4. 线程启动规则
  5. 线程终止规则
  6. 中断规则
  7. 终结器规则
  8. 传递性

final字段的特殊保证

class FinalExample {  final int x;  int y;  public FinalExample() {  x = 42;  // final写  y = 1;   // 普通写  }  
}  // 其他线程看到的x一定是42,但y可能为0  
4.3 内存屏障的C实现

Linux内核屏障示例

// 写屏障  
void smp_wmb() {  asm volatile("" ::: "memory");  
}  // 读屏障  
void smp_rmb() {  asm volatile("" ::: "memory");  
}  // 使用示例  
data = 42;  
smp_wmb();  
flag = 1;  

五、线程池与工作窃取

5.1 C线程池的原始实现

典型实现结构

typedef struct {  pthread_t* threads;  task_queue_t queue;  pthread_mutex_t lock;  pthread_cond_t cond;  int shutdown;  
} thread_pool_t;  void* worker_thread(void* arg) {  thread_pool_t* pool = arg;  while (1) {  pthread_mutex_lock(&pool->lock);  while (queue_empty(pool->queue) {  pthread_cond_wait(&pool->cond, &pool->lock);  }  task_t task = queue_pop(pool->queue);  pthread_mutex_unlock(&pool->lock);  task.func(task.arg);  }  return NULL;  
}  

性能瓶颈

  • 全局锁竞争
  • 缓存行伪共享
  • 任务分配不均
5.2 ForkJoinPool的黑魔法

工作窃取算法

  1. 每个工作线程维护双端队列
  2. 本地任务LIFO获取(缓存局部性)
  3. 窃取其他队列的头部任务

Java实现核心

public class ForkJoinPool extends AbstractExecutorService {  static final class WorkQueue {  volatile int base;         // 窃取指针  int top;                   // 本地指针  ForkJoinTask<?>[] array;   // 任务数组  WorkQueue next;            // 链表结构  }  
}  
5.3 性能对比测试

100万任务执行时间

线程池类型C实现(pthread)Java ForkJoinPool
计算密集型850ms620ms
IO密集型1.2s0.9s
混合任务1.5s1.1s

六、C程序员的并发转型

6.1 思维模式转换矩阵
C并发模式Java最佳实践注意事项
pthread_createExecutorService提交任务避免直接创建Thread
互斥锁/条件变量synchronized/wait/notify使用高阶Lock API更灵活
原子操作AtomicXXX类比volatile更强大的原子性
自旋锁自适应自旋(JVM优化)无需手动实现
信号量Semaphore类支持公平策略
6.2 并发设计模式迁移

C的消息队列实现

typedef struct {  void** buffer;  int capacity;  int front;  int rear;  pthread_mutex_t lock;  pthread_cond_t not_empty;  pthread_cond_t not_full;  
} BlockingQueue;  

Java等效实现

BlockingQueue<Object> queue = new LinkedBlockingDeque<>(capacity);  // 生产者  
queue.put(message);  // 消费者  
Object message = queue.take();  
6.3 调试与性能调优

诊断工具对比

工具C(Linux)Java
性能分析perfVisualVM Profiler
死锁检测HelgrindJConsole线程页
内存检查ValgrindEclipse Memory Analyzer
锁竞争分析perf lockJava Flight Recorder

七、Java内存模型深度探秘

7.1 重排序的幽灵

JIT优化示例

int a = 0, b = 0;  // 线程1  
a = 1;  
b = 2;  // 线程2  
while (b != 2);  
System.out.println(a); // 可能输出0!  

解决方案

volatile int b = 0;  // 插入内存屏障  
7.2 final字段的特殊规则

安全初始化模式

public class SafePublication {  private final int x;  public SafePublication() {  x = 42;  // final写  }  public void print() {  System.out.println(x);  // 保证看到42  }  
}  
7.3 内存屏障的JVM实现

X86架构实现

lock addl $0,0(%rsp)  // 将栈顶加0,使用lock前缀实现屏障  

ARM架构实现

dmb ish              // 数据内存屏障指令  

八、并发集合的内部机密

8.1 ConcurrentHashMap的分段锁

Java 7实现

Segment<K,V>[] segments;  // 分段锁数组  static final class Segment<K,V> extends ReentrantLock {  transient volatile HashEntry<K,V>[] table;  
}  

Java 8优化

  • 改用CAS+synchronized
  • 树化优化(链表→红黑树)
8.2 CopyOnWriteArrayList实现

写时复制机制

public boolean add(E e) {  synchronized (lock) {  Object[] elements = getArray();  int len = elements.length;  Object[] newElements = Arrays.copyOf(elements, len + 1);  newElements[len] = e;  setArray(newElements);  return true;  }  
}  

转型检查表

C习惯Java并发实践完成度
手动管理线程生命周期使用Executor框架
显式锁/条件变量synchronized/Lock API
忙等待检查标志BlockingQueue等待/通知
共享内存消息传递使用并发集合
原子操作内联汇编AtomicXXX类

附录:JVM并发调试命令

查看线程状态

jstack <pid>  # 输出示例  
"main" #1 prio=5 os_prio=0 tid=0x00007f487400a800 nid=0x1a03 waiting on condition [0x00007f487b5d4000]  java.lang.Thread.State: TIMED_WAITING (sleeping)  

性能分析

jcmd <pid> VM.native_memory  
jcmd <pid> GC.heap_dump /path/to/dump.hprof  

下章预告
第十七章 IO流:超越FILE*的维度战争

  • NIO的零拷贝与mmap原理
  • 异步IO的Promise模式
  • 文件锁的跨平台实现

在评论区分享您在多线程调试中的血泪史,我们将挑选典型案例进行深度剖析!

相关文章:

【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十六章 多线程:从pthread到JMM的升维

一、并发编程的范式革命 1.1 C多线程的刀耕火种 C语言通过POSIX线程&#xff08;pthread&#xff09;实现并发&#xff0c;需要开发者直面底层细节&#xff1a; 典型pthread实现&#xff1a; #include <pthread.h> int counter 0; pthread_mutex_t lock PTHREAD…...

数据库学习笔记(十三)---存储过程

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇存储过程&#xff0c;下一篇是存储函数;虽然MYSQL命令很多&#xff0c;但是自…...

JWT(JSON Web Token)源码分析

Java - JWT的简单介绍和使用 Java JWT&#xff1a;原理、机制及案例示范 什么是JWT&#xff1f; 1.1 JWT的基本概念 JWT&#xff08;JSON Web Token&#xff09;是一种用于在各方之间传递JSON格式信息的紧凑、URL安全的令牌&#xff08;Token&#xff09;。JWT的主要作用是验…...

Vue 3 中通过 createApp 创建的 app 实例的所有核心方法,包含完整示例、使用说明及对比表格

以下是 Vue 3 中通过 createApp 创建的 app 实例的所有核心方法&#xff0c;包含完整示例、使用说明及对比表格&#xff1a; 1. app.component() 作用&#xff1a;注册全局组件 参数&#xff1a; name&#xff1a;组件名称&#xff08;字符串&#xff09;component&#xff…...

Hadoop 单机模式(Standalone Mode)部署与 WordCount 测试

通过本次实验&#xff0c;成功搭建了 Hadoop 单机环境并运行了基础 MapReduce 程序&#xff0c;为后续分布式计算学习奠定了基础。 掌握 Hadoop 单机模式的安装与配置方法。 熟悉 Hadoop 环境变量的配置及 Java 依赖管理。 使用 Hadoop 自带的 WordCount 示例程序进行简单的 …...

线段树合并与分解

合并 #include <bits/stdc.h> using namespace std; #define asd(i,a,b) for(int ia;i<b;i) #define int long long const int inf 0x3f3f3f3f, N 1e5 5, Z 1e5; int n, m, fa[N], o[N][25], dep[N], tot, root[N], ans[N]; vector<int> g[N]; struct node…...

驱动开发硬核特训 │ 深度解析 fixed regulator 驱动与 regulator_ops

一、引言&#xff1a;本次目标 本篇聚焦于&#xff1a; Regulator 子系统基础概念设备树节点与驱动代码的对应关系regulator_desc、regulator_ops、regulator_dev 的完整讲解驱动端的实际注册与管理流程 通过一个实际案例&#xff0c;系统掌握 regulator 子系统 的全貌。 二…...

Linux中的shell脚本练习

1.判断字符串是否为空 #!/usr/bin/bash while : #:默认值为真 do read -p "请输入你的密码: " a pass123456 if [ -z $a ];thenecho "您输入的密码不能为空"exit 1 elseif [ $a $pass ];thenecho "登录成功"breakelseecho "您的密码输入有…...

MySQL基础篇 | 1-数据库概述与MySQL安装

【MySQL基础篇-1】数据库概述与MySQL安装 1. 数据库概述2. MySQL环境搭建2.1. MySQL的四大版本2.2. 软件下载1. 数据库概述 MySQL官网网站:https://dev.mysql.com/doc/relnotes/mysql/8.0/en/ SQL Server:SQL Server是微软开发的大型商业数据库。C#、.net等语言常使用,与wi…...

JVM 自动内存管理

一、运行时数据区域详解 Java 虚拟机在运行 Java 程序时&#xff0c;会将所管理的内存划分为多个不同的数据区域&#xff0c;各区域有着独特的用途、创建和销毁时间。 程序计数器&#xff1a;作为线程私有的较小内存空间&#xff0c;它是当前线程执行字节码的行号指示器。字节…...

InitializingBean接口和@PostConstruct-笔记

1. InitializingBean 简介 1.1 功能简介 InitializingBean 是 Spring 框架中的一个接口&#xff0c;用在 Bean 初始化后执行自定义逻辑。它提供了 afterPropertiesSet() 方法&#xff0c;该方法在以下时机被 Spring 容器自动调用&#xff1a; 属性注入完成后&#xff08;即所…...

考研408-计算机组成原理冲刺考点(1-3章)

第一章 计算机系统概述 1.计算机核心 早期的冯诺依曼计算机是以运算器为中心的,而现在的计算机是以存储器为中心的 2.五大部件 3.汇编程序、编译程序、解释程序的辨析...

模板方法模式(Template Method Pattern)

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。 一、基础 1. 意图 定义一个操作中的算法骨架,将某些步骤延迟到…...

一文了解无人机系统

无人机系统&#xff0c;又称无人驾驶航空器系统&#xff08;Remotely Piloted Aircraft System&#xff0c;RPAS&#xff09;&#xff0c;作为一个由无人机平台、遥控站、指令与控制数据链及其他部件构成的完整技术体系&#xff0c;其系统架构包含多个核心分系统。具体而言&…...

系统架构师2025年论文《论软件的设计模式》

论软件的设计模式 摘要: 2016 年,我所在的公司承担了某市医院预约挂号系统的研发任务。我作为公司的技术总监,希望能打造基于该系统的系列产品,参与到项目的设计中,以期开发扩展性和可维护性良好的预约挂号系统,为以后的产品开发打下基础。网络靶场是网络安全技术研究的…...

集成电路流片随笔19:full_handshake

全双工握手接收模块 (full_handshake_rx)&#xff0c;它的功能是接收来自发送端 (tx) 的数据&#xff0c;并对发送端进行应答&#xff08;ACK&#xff09;。模块实现了基于握手的通信机制&#xff0c;以确保数据的可靠传输。模块的输入输出分别连接于发送端和接收端&#xff0c…...

Android Framework 探秘

以下文字来源AI&#xff0c;准确性不敢保证&#xff01; 安卓Framework层概述 安卓的 Framework&#xff08;框架层&#xff09; 是安卓系统的核心组成部分&#xff0c;位于应用层和系统底层&#xff08;如Linux内核&#xff09;之间&#xff0c;负责为应用提供统一的接口和功…...

亚马逊云科技2025战略解析:AI驱动下的全球生态重塑

一、战略转向&#xff1a;从“云优先”到“AI优先”的核心逻辑 1. 千亿美元资本投入AI基建 芯片自研突破&#xff1a;2025年资本支出70%投向AI芯片与液冷数据中心。自研芯片矩阵全面升级&#xff0c;包括3纳米工艺的Trainium3&#xff08;算力提升4倍&#xff09;、单核性能…...

NGINX ngx_http_addition_module 模块响应体前后注入内容

一、模块概述 模块名称&#xff1a;ngx_http_addition_module引入版本&#xff1a;自 0.7.9 起支持 addition_types&#xff0c;0.8.29 起支持“*”通配&#xff1b;功能&#xff1a;对符合 MIME 类型的响应&#xff0c;在响应体前后分别插入指定子请求 URI 返回的内容&#x…...

SpringMVC 使用thymeleaf 进行数据展示

thymeleaf 是前端的视图解析器&#xff0c;可以用于html页面上变量的渲染&#xff0c;如何来使用thymeleaf&#xff0c;下面我们来说一下&#xff1a; 首先引入相关的依赖&#xff1a; <dependency><groupId>org.thymeleaf</groupId><artifactId>thym…...

Github两种鉴权模式PAT与SSH

Github两种鉴权模式PAT与SSH 文章目录 Github两种鉴权模式PAT与SSH1. PAT鉴权2. SSH鉴权3.两种鉴权的切换 1. PAT鉴权 通过 HTTPS 协议克隆和推送代码&#xff0c;使用用户名/密码或个人访问令牌&#xff08;PAT&#xff09;鉴权&#xff0c;所以PAT是与HTTPS协议相关的。该鉴…...

XrayR启动失败

公司要用服务器之间进行数据加密&#xff0c;这里用的XrayR 我使用的Centos 7。 我这里使用一键脚本安装后&#xff0c;/etc/XrayR目录下没有配置文件。 解决方案 XrayR安装时&#xff0c;系统没有unzip工具&#xff0c;也是会安装失败的&#xff0c;因为Centos7已经停止维…...

FPGA-数字时钟

FPGA-数字时钟 总体设计 ​ 用FPGA驱动数码管按照HH-MM-SS的格式显示时间&#xff0c;每秒用串口向上位机发送当前时间&#xff0c;当串口收到HH:MM:SS&#xff0c;对时间进行校准。由于年月要考虑到大小月&#xff0c;闰年等。为了简单起见&#xff0c;只考虑时分秒。 数码管…...

数据结构 RBT 插入操作的 Python 代码实现

目录 一、红黑树的性质二、红黑树的插入1. 插入根节点或根节点变红2. 双亲节点 P 为黑色3. 双亲结点 P 和叔伯结点 U 均为红色4. 双亲结点 P 为红色&#xff0c;叔伯结点 U 为黑色或缺失1&#xff09;情形一2&#xff09;情形二 三、插入的 Python 代码实现 红黑树动画演示网站…...

颖儿生活提案:用海信璀璨505U6真空冰箱重建都市鲜食自由

热播剧《六姊妹》中&#xff0c;演员颖儿饰演的何家艺以泼辣坚韧的形象深入人心&#xff0c;一双手撑起家庭的"烟火气"&#xff1b;戏外&#xff0c;她平衡事业与家庭&#xff0c;以自律姿态书写鲜活人生。 近日&#xff0c;颖儿向公众展示家中厨房&#xff0c;意外…...

JQuery 使用技巧

文章目录 隐藏/显示淡入淡出滑动追加新元素删除元素/内容设置 CSS 样式尺寸遍历Ajax根据 input 控件中的值 实时改变另一个值 $()是jQuery()的简写getElementByTagName();如&#xff1a; $(“div”)getElementByTagName(“div”); $()的作用是用于查找出 HTML 的标签、属性、样…...

光流法:从传统方法到深度学习方法

1 光流法简介 光流&#xff08;Optical Flow&#xff09;是指图像中像素灰度值随时间的变化而产生的运动场。 简单来说&#xff0c;它描述了图像中每个像素点的运动速度和方向。 光流法是一种通过分析图像序列中像素灰度值来计算光流的方法。对于图像数据计算出来的光流是一个二…...

如何选择合适的RFID手持终端设备?

一、明确核心需求&#xff0c;锁定关键参数 选购RFID手持终端的首要任务是明确应用场景的核心需求。若用于仓储物流或零售盘点&#xff0c;推荐选择上海岳冉超高频RFID手持终端设备&#xff0c;支持1-20米远距离批量读取&#xff1b;若用于医疗耗材或图书管理&#xff0c;岳冉高…...

Axios 传参与 Spring Boot 接收参数完全指南

Axios 传参与 Spring Boot 接收参数完全指南 本文详细说明前端 Axios 传参与后端 Spring Boot 接收参数的各类场景&#xff0c;包括 GET/POST/PUT/DELETE 请求、路径参数/查询参数/请求体参数 的传递方式&#xff0c;以及如何接收 List、Map 等复杂类型。通过代码示例和对比表…...

NdrpPointerUnmarshallInternal函数分析之pStubMsg--pAllocAllNodesContext的由来

第一部分&#xff1a; // // Check if this is an allocate all nodes pointer AND that were // not already in an allocate all nodes context. // if ( ALLOCATE_ALL_NODES(pFormat[1]) && ! pStubMsg->pAllocAllNodesContext …...

人脑、深思考大模型与其他大模型的区别科普

文章目录 大模型的基本概念与特点深思考大模型的独特之处深思考大模型与其他大模型的对比架构与技术训练数据应用场景提示词编写 大模型给出答案的方式&#xff1a;基于概率还是真的会分析问题&#xff1f;人脑的思考过程基本单位与网络大脑结构与功能分区信息处理流程思维模式…...

Unity-粒子系统:萤火虫粒子特效效果及参数

萤火虫特效由两部分组成。萤火虫粒子底色粒子面片。萤火虫的旋转飞动主要由 Noise参数和Color over Lifetime模块控制。 贴图&#xff1a;中间实周边虚的圆&#xff0c;可随意自行制作 Shader&#xff1a;Universal Render Pipeline/2D/Sprite-Lit-Default 以下是粒子详细参…...

Java垃圾收集器与内存分配策略深度解析

在 Java 与 C 的世界里&#xff0c;内存动态分配与垃圾收集技术仿佛筑起了一道高墙。墙外的人渴望进入&#xff0c;享受自动内存管理的便利&#xff1b;而墙内的人却试图突破&#xff0c;追求更高的性能与控制力。今天&#xff0c;就让我们深入探讨 Java 的垃圾收集器与内存分配…...

优化MySQL性能:主从复制与读写分离实践指南

目录 一、知识介绍 1.MySQL主从复制原理 2.MySQL读写分离原理 二、资源清单 三、案例实施 1.修改主机名 2.搭建MySQL主从复制 3.搭建MySQL读写分离 一、知识介绍 1.MySQL主从复制原理 MySQL支持的复制类型 基于语句的复制基于行的复制混合模型复制 工作过程 主&#…...

Foupk3systemX5OS系统产品设备

Foupk3systemX5OS TXW8&#xff08;基于Foupk3systemX5OS系统19.62正式版开发的智能移动设备由Foupk3systemX5OS系统与FOUPK3云服务平台共同自主研发&#xff09; Foupk3systemX5OS TX6&#xff08;Foupk3systemX5OS TX6基于Foupk3systemX5OS系统19.60正式版开发的智能平板设备…...

【计网】认识跨域,及其在go中通过注册CORS中间件解决跨域方案,go-zero、gin

一、跨域&#xff08;CORS&#xff09;是什么&#xff1f; 跨域&#xff0c;指的是浏览器出于安全限制&#xff0c;前端页面在访问不同源&#xff08;协议、域名、端口任一不同&#xff09;的后端接口时&#xff0c;会被浏览器拦截。 比如&#xff1a; 前端地址后端接口地址是…...

关于 【Spring Boot Configuration Annotation Processor 未配置问题】 的详细分析、解决方案及代码示例

以下是关于 Spring Boot Configuration Annotation Processor 未配置问题 的详细分析、解决方案及代码示例&#xff1a; 1. 问题描述 当使用 Spring Boot 的配置注解&#xff08;如 ConfigurationProperties、Value、ConditionalOnProperty 等&#xff09;时&#xff0c;若未…...

MySQL 的ANALYZE与 OPTIMIZE命令

MySQL 的ANALYZE与 OPTIMIZE命令 一、ANALYZE TABLE - 更新统计信息 1. 基本语法与功能 ANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...作用&#xff1a;收集表统计信息用于优化器生成更优的执行计划&#xff0c;主要更新&#xff1a; 索引基数&am…...

【机器学习】人工智能在电力电子领域的应用

摘要&#xff1a; 本文概述了电力电子系统的人工智能 (AI) 应用。设计、控制和维护这三个独特的生命周期阶段与人工智能要解决的一项或多项任务相关&#xff0c;包括优化、分类、回归和数据结构探索。讨论了专家系统、模糊逻辑、元启发法和机器学习四类人工智能的应用。我们对…...

InferType和_checked_type的区别?

在 TVM 的 Relay IR 中&#xff0c;relay.frontend.common.infer_shape(node) 和 node.checked_type.shape 都与**形状&#xff08;Shape&#xff09;**信息相关&#xff0c;但它们的用途、实现机制和性能特点有显著区别。以下是详细对比&#xff1a; 1. 功能区别 特性node.ch…...

Flutter 学习之旅 之 flutter 作为 module ,在 Android 端主动唤起 Flutter 开发的界面 简单的整理

Flutter 学习之旅 之 flutter 作为 module &#xff0c;在 Android 端主动唤起 Flutter 开发的界面 简单的整理 目录 Flutter 学习之旅 之 flutter 作为 module &#xff0c;在 Android 端主动唤起 Flutter 开发的界面 简单的整理 一、简单介绍 二、Android 端唤起 Flutter …...

vue3 css模拟语音通话不同语音、正在加载等的效果

实现效果如下&#xff1a; 在不同的时间&#xff0c;显示不一样的效果&#xff08;大小是一样的&#xff0c;截图时尺寸发生了变化&#xff09; 具体实现代码如下&#xff1a; <script setup> import {ref} from "vue";const max_hight ref(40px) const min…...

【Machine Learning Q and AI 读书笔记】- 01 嵌入、潜空间和表征

Machine Learning Q and AI 中文译名 大模型技术30讲&#xff0c;主要总结了大模型相关的技术要点&#xff0c;结合学术和工程化&#xff0c;对LLM从业者来说&#xff0c;是一份非常好的学习实践技术地图. 本文是Machine Learning Q and AI 读书笔记的第1篇&#xff0c;对应原…...

[Agent]AI Agent入门02——ReAct 基本理论与实战

ReAct介绍 ReAct&#xff08;Reasoning and Acting&#xff09;是一种通过协同推理&#xff08;Reasoning&#xff09;与行动&#xff08;Acting&#xff09;提升大语言模型&#xff08;LLM&#xff09;任务解决能力的技术。其核心思想是在解决复杂问题时交替生成推理和动作&a…...

uniapp自定义头部(兼容微信小程序(胶囊和状态栏),兼容h5)

很早之前就写过自定义头部&#xff0c;但是那时偷懒写死了&#xff0c;现在用插槽重新写了个 有两种形式&#xff1a; type1是完全自定义的&#xff0c;可以自己去组件改也可以用插槽改 type2是正常的返回标题和右边按钮&#xff0c;使用就是 title"标题" rightClic…...

mybatis的xml ${item}总是更新失败

场景 代码如下 void updateStatus(Param("deviceSerialIdCollection") Collection<String> deviceSerialIdCollection, Param("status") Integer status);<update id"updateStatus">UPDATE gb_monitor SET online#{status} WHERE d…...

数据库- JDBC

标题目录 JDBC基本概念JDBC 接口JDBC 工作原理 JDBC APIJDBC工作过程Driver 接口及驱动加载Connection 接口Statemen 接口ResultSet 接口PreparedStatement 接口 JDBC 基本概念 Java Database Connectivity&#xff1a;java访问数据库的解决方案希望用相同的方式访问不同的数…...

[26] cuda 应用之 nppi 实现图像格式转换

[26] cuda 应用之 nppi 实现图像格式转换 讲述 nppi 接口定义通过nppi实现 bayer 格式转rgb格式官网参考信息:http://gwmodel.whu.edu.cn/docs/CUDA/npp/group__image__color__debayer.html#details1. 接口定义 官网关于转换的原理是这么写的: Grayscale Color Filter Array …...

MYSQL-OCP官方课程学习截图

第一节 介绍...

医院信息管理系统全解析

目录 一、医院信息管理系统是什么 1. 概念阐释 2. 核心功能概述 二、医院信息管理系统的种类 1. 医院信息系统&#xff08;HIS&#xff09; 2. 电子病历系统&#xff08;EMR&#xff09; 3. 实验室信息管理系统&#xff08;LIS&#xff09; 三、医院信息管理系统的实际…...