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

Java中进阶并发编程

第一章、并发编程的挑战 

并发和并行:指多线程或多进程 

线程的本质:操作系统能够进行运算调度的最小单位,是进程(Process)中的实际工作单元

进程的本质:操作系统进行资源分配和调度的基本单位,是程序的一次动态执行过程。

多线程定义:在同一个进程内创建多个线程,共享进程的内存和资源(如堆、全局变量),但每个线程有独立的栈和程序计数器。

多进程定义:操作系统同时运行多个独立的进程,每个进程有独立的内存空间和系统资源。

操作系统:操作系统(Operating System, OS)是计算机系统的核心管理者硬件与软件的桥梁

并发和并行的区别是什么? 

【本文专注于多线程】

并行:不同的线程或进程间互不干扰 

并发:不同的线程之间有资源的竞争

线程的基本代码: 

Thread t1---->创建第一个线程

Thread t2----->创建第二个线程

运行时是两个任务交替运行;去掉t1.join()/t2.join(),运行是3个任务交替运行

线程的几种状态: 

操作系统的指令执行不是立刻的,而是一个任务调度的过程;指令的最终执行靠的是CPU里的运算核心。

在任务管理器中,句柄指变量,核心指CPU中间的运算核心【ALU】,每个核心同一时刻只能执行一个任务。【因为电压信号同时传输会合并为一个信号】;内核为14指CPU同时只能执行14个指令,每个基础指令是线程级别,可以认为是一个任务--->CPU同时最多执行14个任务;快速切换任务执行;

1、CPU内部的信号指令1010,都是电压信号,高电压代表1,低电压代表0,电压信号不能同时传递,必须是排队传输。

2、计算机内部的各个硬件之间的指令传输都是高低电压传输硬件之间的指令传输,由于电压传输,每个指令必须得排队。 

 就绪队列:每个任务都进入就绪态,操作系统随时可以选中去执行,由就绪态选中变成运行状态,当剩的时间片不多,执行完时,从就绪队列清除,变成死亡状态。

时间片: 决定了任务在就绪队列中能连续占用CPU的时长

在电脑中任何任务的提交不能绕过操作系统。

队列为什么不是先进先出?

 先进先出是公平队列,整体性能损耗较大;

操作系统里是非公平队列,判定时是按顺序判断该任务是否符合条件,只有符合条件的才会被选中;所以态既叫队列,又叫非公平队列;

为什么微信,QQ等一直在运行状态? 

里面有一个死循环,当用户点击关闭触发条件判定, 循环判定不满足,程序结束。

在微信、QQ等应用保持后台运行的场景中,“死循环”通常指的是主线程的事件循环(Event Loop)。

用户是不能让程序直接进入运行态的,用户只能交给操作系统让它进入就绪态。

 

代码内存图:

 方法的执行都是拷贝入栈;方法本身也是一个栈结构;Java的引用类型变量底层是C语言的指针;new的两个对象在底层是C语言创建的空间,是在堆区域创建了两个线程对象;t1对象属于线程类;Thread里有很多属性和方法,上述代码只是对run方法进行重写;

run和start方法是非静态方法,在每个对象里都有一份;

main方法被static修饰,只有一份;

方法的调用都是拷贝入栈;

t1的start方法拷贝入栈后,t1的start方法会把它的整个线程信息交给操作系统的就绪队列,提交完后出栈------t2的start拷贝入栈,t2的start把t2的信息提交给操作系统,t2在就绪队列,t2再出栈-----主方法本身也在就绪队列里----操作系统随时选中执行,选中后再创建新线程【比如针对t1创建t1线程栈,针对t2创建t2线程栈】---t1被操作系统选中后会执行里面的run方法,run方法拷贝进入t1线程;

类.方法-----方法是静态的

通过主线程可以创建子线程,创建完之后就相互独立;

先进入就绪态被操作系统选中的概率大,但是顺序不确定;

上下文切换【面试点】

CPU每次执行完任务会把任务执行到哪了记下来,下次再执行时会去读从哪接着开始执行,时间损耗是毫秒级。

定义:

上下文切换是操作系统在多任务环境中,将CPU从一个线程(或进程)切换到另一个线程(或进程)时,保存当前任务状态并恢复新任务状态的过程。它是并发编程中影响性能的关键因素之一。

时间片一般是几毫秒——几十毫秒,不同操作系统不一样。

 多线程一定会涉及到上下文切换,频繁的上下文切换一定会额外消耗CPU的时间。

什么情况下用多线程?【面试题】

多线程在CPU浪费严重的情况下使用。【执行时间和等待时间比例特别悬殊的情况相爱,采用多线程】(一定是io密集,就是大量的高频访问网落访问硬盘)

IO密集型(输入输出):出现了大量的CPU等待时间。

io:访问网落,访问硬盘

指令密集型:大量给CPU任务---单线程合适

join() 是 Java 多线程编程中的一个核心方法,用于让当前线程等待另一个线程执行完毕

t1、t2都执行完时,for循环才会执行。

t1、t2的执行互不等待;只有t1执行完时,t2才会发出join指令

 在栈里,只有栈顶的元素处于运行状态,不在栈顶处于停止运行状态。

在这个代码里,对比单线程执行两个for循环和两个线程分别执行for循环哪个更快。【thread.jon和输出时间戳互换】

串行:单线程---并发:多线程

只有一个核心,单线程最快

用什么工具来监控内存?----Lmbench3可以测量上下文切换的时长,指令:vmstat---可以测量上下文切换的次数【面试点】

如何减少上下文切换?【面试点】----无锁并发编程、CAS算法、使用最少线程和使用协程。


 


grep指令:文本搜索工具;在文件或输入流中匹配指定模式(正则表达式)

awk指令:文本处理与报表生成;逐行处理文本,按字段(默认以空格/Tab分隔)提取、计算或格式化输出。

sort指令: 文本排序工具;对文件或输入流按行排序(默认按字典序)。

dump指令:快照,查看这一瞬间内存中的信息【面试点】

指令结合案例:

sudo:Linux中使用管理员指令。

在后面的目录下查询id为31177的线程,把查看的信息保存为后面路径下的dump17文件。

 用grep指令在dump17文件中筛选行里有java.lang.Thread.State的信息,然后统计完排序。


 死锁

 非静态方法必须依托对象的存在,在每个对象里都有一份。

synchronized(A)是对A加锁;加锁只能对引用类型加锁,锁住A后其他线程不允许读A ;

当进入睡眠状态时,即使时间片没执行完也必须让出CPU,并且不在就绪队列。【面试点】

 锁住A后什么时候会释放锁?---把{ }里的全部执行完才会释放

一个线程就算进入睡眠状态,也不会释放锁。【面试点】

sleep方法:让出CPU,但不释放锁

wait方法:让出CPU,并且释放锁 【面试点】

 加锁其实是给当前线程加上标记。

t1锁住A后沉睡,t2被操作系统选中锁住B后访问A失败,t2让出CPU进入阻塞队列,但锁仍未释放;2秒之后t1进入就绪队列,想要锁B失败,t1也进入阻塞队列------->死锁;

但不会消耗CPU,CPU仍可以执行其他任务,只是这两个任务永远执行不完了

竞争失败要进入阻塞队列;进入阻塞队列操作系统不会选中;

 恰巧的情况下,t2先执行,就不会出现死锁了。

 如何避免死锁?【面试点】

 

 

第二章、JAVA并发机制的底层实现原理

synchronize:重量级锁;读写都锁住---->读写都安全

volatile:轻量级锁(功能不全的锁);只能锁住写-->读安全,写不安全【面试点】

 volatile在多处理器(CPU里的多核心)开发中保证了共享变量的“可见性”----->当一个线程修改另一个共享变量时,另外一个线程能读到这个修改的值。

CPU要从内存中读取数据进行操作;内存中存储的是变量以及函数在它的运行状态下的数据;

CPU通过总线(本质上是导线)向内存中传输指令(1010指令就是电压信号);

单根导线上同一时刻只能过一个电压信号;总线的宽度一般是36-41位(并排三十多根到四十多根的导线);

一个指令通常先传地址,再传数据;

一次指令差不多是一个最基本的指令,也就是总线的宽度;不同的指令是不同同时传输的,不然电压信号会相互干扰;

指令在总线必须排队传输--->存在指令队列

内存和CPU的数据是双向的; 但CPU发送的指令比内存多,所以指令队列在CPU;

内存同一时刻只能被一个指令所指挥;

 假设现在有三个线程,分别对a,b,c for循环一万次,a通过总线读完+1再通过总线往回更新;

当a进行读写操作时,总线一直被占用,其他两个核心没办法操作;--->此时多核没意义

现在,CPU和内部的存储一直交互释放了总线,总线就可以把其他线程的数据读过来操作了--->支持了多核CPU的发展

a加到1万返回内存,在总线上一来一回,对总线占用的不多;

所以CPU的存储越多,存的数据越多,对核心的支持也越多,对总线的压力降低越明显,CPU内部存储和性能关乎大;

长距离网络传输时,一根导线可以同时存在多个电压信号。

 

 加入中转站后效率大幅度提高,但转发也损耗时间,不是越多越好,平衡点性能最好的平衡点是三级缓存。

多级缓存(L1/L2/L3)通过 减少CPU核心的等待时间 和 优化数据局部性,显著提高核心利用率。

高速缓存的并发性问题

现在有两个线程操作同一个变量a,线程1拿到时间片,将a加到10 ,还没往回更新时时间片到期,停止运行,线程2拿到时间片,将a加到10,往回更新,任务执行完释放CPU,线程1接着执行,往回更新---->此时两个线程一共加了20,但是最终的结果是10---->导致了相互覆盖问题。

高速缓存优点:增加传输效率,提升CPU利用率

高速缓存缺点:会导致数据相互覆盖

高速缓存往回更新是随机的,不一定计算完后往回更新;------->最终结果是不确定的

高速缓存往回更新时,高速缓存内的数据会清空,下一次计算需要重新从内存读取数据。


内存屏障:在内存中有一个变量标记,根据这个标记判断是否要访问。

缓存行:高速缓存的基本存储单元【一个缓存行64字节,没一个缓存行和外界相连的导线线路进行数据交互;】处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期【一个周期从内存中读数据叫做一个主内存周期】

计算机存储区域:内存、硬盘、CPU内部的高速缓存---数据是一份份存储的,硬盘和内存中的数据单元是4KB

计算机中最小的物理单元是一字节一个存储单元,操作系统给硬盘和内存划分的逻辑存储是4KB一个存储区域-----在硬盘上,一个存储单元是栈区,在内存中一个存储单元是一个页,在高速缓存中存储单元是一个缓存行64字节。

一个缓存行可以存多份不同任务的数据,其中一个任务占着线操作时,其他任务就不能对它操作了--->所以每个任务过来操作时,相当于独占整个缓存行(不同芯片不一样,但每个都是独占的),造成一定性能损耗。

原子操作:不可中断的一个或一系列操作(一系列操作要么都成功,要么都失败,其中一个步骤如果失败,其他步骤都要还原)

在电脑底层只存在C语言的基本类型数据(6种基本数据:short  int  long bool double char ),其他语言在电脑内部都会转成C语言;

缓存行主要用于存储六种基本类型的数据,其容量从一字节到八字节不等。由于缓存行可容纳大量数据,当多个进程同时进行读写操作时,容易造成拥堵现象。具体而言,缓存行中存储的数据越多,发生排队的概率就越大;反之,数据量越少,排队概率则越小。

为优化性能,我们可采取以下策略:首先,尽量在缓存行中存储体积较大的数据,以减少数据总量,从而降低竞争概率。其次,在存储数据时,可采用独占式填充策略,即用自身数据填满整个缓存行。这种做法的优势在于,当需要读取数据时,可以避免竞争,实现快速访问,从而显著提升性能。

然而,这种优化策略的适用性取决于数据规模。在数据量较少时,这种方法是可行的;但当数据量较大时,若缓存行中存储的数据过少,反而会导致整体性能下降。因此,缓存行的设计需要权衡利弊,这也是为什么标准缓存行大小通常设定为64字节。过大的缓存行会增加拥堵风险,反而降低读取效率,有时甚至不如直接从内存读取。

对于追求极致性能的场景,可以将整个64字节缓存行用于存储单一数据。这种独占式存储方式能够确保每次读取都畅通无阻,达到最佳性能表现。

缓存命中:高层缓存容量有限,仅能存储少量数据。当核心处理器需要访问数据时,首先会查询高速缓存。若所需数据存在于缓存中,则直接返回,这种情况称为缓存命中;若缓存中不存在,则需访问内存,这种情况称为缓存未命中。由于缓存空间有限,部分数据可能存储在缓存中,而另一部分则不在,因此每次访问都需要先检查缓存是否存在所需数据,再决定是否访问内存。这一过程就是缓存命中的基本原理。

 写命中:------>针对高速缓存

当数据写回到内存缓存区域时,系统会首先检查该缓存地址是否存在于缓存中。以读取变量a为例:首先读取a,然后对a进行操作,操作完成后再将结果更新回缓存。在这个过程中,如果缓存中存在a的地址,称为写命中;如果不存在,则称为写未命中。值得注意的是,由于高速缓存空间有限,之前存储的数据可能已被清理。如果数据已被清除,在写回时就无法找到对应的缓存地址,从而导致写未命中。

写缺失: -------->针对内存

举例:a=5往回更新时,可能有其他线程把内存中的a删除,内存中的a没了,这种情况就是写缺失。

 【以上术语只有原子操作、缓存命中是学术性术语,其他几个面试面不到】


x86处理器是指CPU的内部结构;以下内容以x86处理器为主:

主流CPU处理器: x86架构、ARM架构【军队政府学校】、RISC-V 架构

 new的对象被volatile修饰,转换成汇编代码,里面有lock指令;

有volatile变量修饰的共享变量进行写操作时会多出第二行汇编代码---->CPU架构

 

当内存中的a被volatile变量修饰时,其中一个a往回更新时,另一个在高速缓存中的a失效 ;

但是用volatile修饰后还是会出错,如图,当a=10进入队列时,时间片到期,a=20执行指令,高速缓存中的数据失效,但问题是数据已经进入队列,所以仍会出现覆盖问题。

volatile并不能保证准确性。

补充:内存图角度理解并发编程

进程:正在执行的程序,内存为正在执行的程序开辟内存空间

线程:程序的执行过程,线程的执行依赖方法的不断入栈出栈

内存会为正在运行的程序开辟内存空间;

方法区:存储类信息

对象在堆里开辟空间

只有争抢的资源需要加锁,不争抢不用加锁

synchronized不能对变量进行加锁

锁是要加在被争抢的资源上的

一个完整的操作不能分开加锁

synchronized修饰静态方法:锁定的是非静态方法:锁方法的调用者,修饰代码块:锁定传入对象

相关文章:

Java中进阶并发编程

第一章、并发编程的挑战 并发和并行:指多线程或多进程 线程的本质:操作系统能够进行运算调度的最小单位,是进程(Process)中的实际工作单元 进程的本质:操作系统进行资源分配和调度的基本单位&#xff0c…...

cursor 出现问题 为客户解决问题

文档出自:https://www.kdocs.cn/l/cp5GpLHAWc0p...

【氮化镓】GaN在不同电子能量损失的SHI辐射下的损伤

该文的主要发现和结论如下: GaN的再结晶特性 :GaN在离子撞击区域具有较高的再结晶倾向,这导致其形成永久损伤的阈值较高。在所有研究的电子能量损失 regime 下,GaN都表现出这种倾向,但在电子能量损失增加时,其效率会降低,尤其是在材料发生解离并形成N₂气泡时。 能量损失…...

用drawdb.app可视化创建mysql关系表

平时自己建表,没有可视化图形参考 为了便于理解,用drwadb画mysql关系表 drawDB | Online database diagram editor and SQL generator...

模型上下文协议(MCP):AI的“万能插座”

~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 一、MCP解决什么问题? \quad 在过去的几年中,AI大模型快速发展,从横空出世的GPT到“AI界拼多多”DeepSeek&am…...

初识 Pandas:Python 数据分析的利器

在数据分析、数据清洗和可视化等领域,Python 无疑是最受欢迎的语言之一,而在 Python 的数据处理生态中,Pandas 是最核心、最基础的库之一。如果你接触数据分析、机器学习、金融建模,或者只是想处理一些 Excel 表格,那么…...

Python教程(四)参数提取pymysql

Python(四) 本系列其他教程: Python教程(二):函数、异常、模块&包、文件读取、常用模块 Python教程(三):类&对象、闭包、装饰器、类型注解 Python教程(三):类&对象、闭包、装饰器、类型注解、…...

Halcon案例(一):C#联合Halcon识别路由器上的散热孔

本案例分3部分 识别效果,分别显示识别前后识别后;代码展示,分别是Halcon源码和Halcon转为C#的代码代码解释(解释在源码中) 原图如下: 处理后的图像: Halcon源码: *读取一张图像 read_image (Image, progres)*获取图像大小 get_image_size (Image, Width, Height)*关…...

SC5061串口设备联网服务器,4路RS-232,4路422/485串行接口

串口设备联网服务器,简称串口服务器。能够将RS-232/485/422串口设备联入TCP/IP网络,实现RS-232/485/422串口与TCP/IP网络接口的数据双向传输,使得串口设备能够具备联网功能,根据串口数量的不同,可以分为单串口、两串口…...

谈AI/OT 的融合

过去的十几年间,工业界讨论最多的话题之一就是IT/OT 融合,现在,我们不仅要实现IT/OT 的融合,更要面向AI/OT 的融合。看起来不太靠谱,却留给我们无限的想象空间。OT 领域的专家们不要再当“九斤老太”,指责这…...

RAGFlow 初步尝试 (01)

1. 起因, 目的: 简单尝试一下。 2. 先看效果 3. 过程: 目的: 研究 RAG 的实现过程。 实用目的: 对于一本电子书, pdf,我在读书的时候,可以问一写些问题。对一个 github 项目,可以迅速理解文件的关系。…...

Linux 服务器用 SSH 拉取多个 Git 工程

在一台 Linux 服务器上用 SSH 拉取两个 Git 工程,而这两个工程对应的是 不同的 Git 账号(SSH Key),做法: 使用 SSH Config 配置多个 Git 账号 场景假设: 工程 A 的仓库地址:gitgithub.com:com…...

测试文章标题01

模型上下文协议(Model Context Protocol, MCP)深度解析 一、MCP的核心概念 模型上下文协议(Model Context Protocol, MCP)是一种用于规范机器学习模型与外部环境交互的标准化框架。其核心目标是通过定义统一的接口和数据格式&am…...

如何禁止chrome自动更新

百度了一下 下面这个方法实测有效 目录 1、WINR 输入 services.msc 2、在Services弹窗中找到下面两个service并disable 3、验证是否禁止更新成功: 1、WINR 输入 services.msc 2、在Services弹窗中找到下面两个service并disable GoogleUpdater InternalService…...

【C++重载操作符与转换】构造函数和复制控制

目录 一、构造函数:对象的初始化引擎 1.1 构造函数的定义与分类 1.2 初始化列表:高效且安全的初始化方式 1.3 显式构造函数与类型安全 二、复制控制:管理对象的生命周期 2.1 复制构造函数:深拷贝的核心 2.2 赋值运算符重载…...

CATIA高效工作指南——常规配置篇(二)

一、结构树(Specification Tree)操作技巧精讲 结构树是CATIA设计中记录模型历史与逻辑关系的核心模块,其高效管理直接影响设计效率。本节从基础操作到高级技巧进行系统梳理。 1.1 结构树激活与移动 ​​激活方式​​: ​​白线…...

神经生物学+图论双buff,揭示大脑语言系统的拓扑结构

摘要 近年来,神经影像数据分析的进展促进了大脑网络整合中适应性变化的表征。本研究提出了一种融合知识驱动与数据驱动的独特方法,为更精确地理解这些变化提供了新思路。通过运用图网络分析,并结合特定领域脑网络系统的现有神经生物学知识&am…...

Kotlin 懒初始化值

Kotlin 懒初始化值:深入理解 lateinit 与 by lazy 在 Kotlin 开发中,懒初始化(Lazy Initialization) 是一种常见的优化技巧,它允许我们将对象的初始化延迟到真正需要使用时再执行。Kotlin 提供了两种核心机制来实现懒…...

高速系统设计实例设计分析

在上几章的内容中,我们从纯粹高速信号的理论分析,到 Cadence 工具的具体使用都做了详细的讲解和介绍。相信读者通过前面章节的学习,已经对高速系统的设计理念及 Cadence 相应的设计流程和工具有了一个基本的认识。但是,对于高速电…...

数据结构与算法学习-JavaScript的Array.prototype.reduce()方法

一、语法 array.reduce(callbackfn, initialValue);callbackfn (accumulator, currentValue, currentIndex, array) > {// 回调逻辑 } callbackFn 为数组中每个元素执行的函数。 其返回值将作为下一次调用 callbackFn 时的 accumulator 参数。对于最后一次调用&#xff0c…...

[Java][Leetcode simple] 189. 轮转数组

借助辅助数组 借助一个辅助数组tmp保存后面k个元素然后逆序循环,使用数组前面n-k个元素覆盖最后到后面最后把前k个元素从tmp中拿回来public void rotate(int[] nums, int k) {int len nums.length;k k % len;int[] Ra new int[len];int cnt 0;for (int i len-k…...

Hadoop 的代理用户(Proxy User)​ 功能解释

在$HADOOP_HOME/etc/hadoop下的core-site.xml 配置里&#xff0c;可以新增hadoop集群的代理用户。 在集成配置中&#xff0c;会经常用到。它属于 Hadoop 安全机制的一部分。 以下是对该配置效果的详细说明及示例&#xff1a; 配置效果 <!-- 允许用户 hadoop 从主机 hadoop…...

day06_java中的流程控制语句

流程控制语句 Java提供了一些流程控制语句&#xff0c;来控制程序的执行流程 顺序结构 任何编程语言中最常见的程序结构就是顺序结构顺序结构就是程序从上到下逐行地执行&#xff0c;中间没有任何判断和跳转如果main方法的多行代码之间没有任何流程控制&#xff0c;则程序总是…...

机器学习实战:归一化与标准化的选择指南

在机器学习实战中——是否需要归一化&#xff08;Normalization&#xff09;或标准化&#xff08;Standardization&#xff09;&#xff0c;取决于所使用的模型类型。 ✅ LightGBM / XGBoost 是否需要归一化或标准化&#xff1f; 不需要。 &#x1f527; 原因&#xff1a; L…...

【内蒙古】《内蒙古自治区本级政务信息化建设项目预算支出标准(试行)》(内财预〔2024〕1449号)-费用标准解读系列

内蒙古自治区政务服务与数据管理局在2024年11月29日发布了《内蒙古自治区本级政务信息化建设项目预算支出标准(试行)》&#xff08;内财预〔2024〕1449号&#xff09;。该文件适用于自治区本级各部门、单位非涉密政务信息化建设项目(以下简称建设项目)经费的预算编制、审核。下…...

文本数据可视化

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 原理 操作步骤 图像展示 【实验目的】 了解什么是文本可视化 掌握文本可视化的相关技术 文本信息的提取和可视表达 本次实验是将某一文本进行可视化生成词云图片 尝试构造文本指纹 【实验原理】…...

qt命名空间演示

#ifndef CIR_H #define CIR_Hnamespace cir {double PI3.141592653;//获取圆行周长double getLenthOfCircle(double radius){return 2*PI*radius;}//获取圆形面积double getAreaOfCircle(double radius){return PI*radius*radius;}} #endif // CIR_H#include <iostream> …...

Android学习总结之布局篇

一、大厂面试高频布局真题解析 1. ConstraintLayout vs RelativeLayout 深度对比 真题问法&#xff1a; "为什么说 ConstraintLayout 是 RelativeLayout 的替代方案&#xff1f;两者在布局原理、性能、复杂场景处理上有什么核心区别&#xff1f;" 核心考点解析&am…...

星际篮球争霸赛/MVP争夺战 - 华为OD机试真题(A卷、Java题解)

华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 针对刷题难&#xff0c;效率慢&#xff0c;我们提供一对一算法辅导&#xff0c; 针对个人情况定制化的提高计划&#xff08;全称1V1效率更高&#xff09;。 看…...

RNN(循环神经网络)原理与结构

1 RNN&#xff08;循环神经网络&#xff09;原理与结构 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类专门用于处理序列数据&#xff08;如时间序列、文本、语音等&#xff09;的深度学习模型。与传统的前馈神经网络不同&#xff0c;RNN在每个时间…...

Claude深度解析:从技术原理到实战应用的全栈指南

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言:AI编程新纪元中的Claude 在生成式AI技术爆发的2024年,Anthropic的Claude系列模型以卓越的长文本处理能力和精确的代码生成质量,正在重塑程序员的开发范式。当开发者…...

9.渐入佳境 -- 套接字的多种可选项

前言 套接字具有多种特性&#xff0c;这些特性可通过可选项更改。本章将介绍更改套接字可选项的方法&#xff0c;并以此为基础进一步观察套接字内部。 一、套接字可选项和I/O缓冲大小 我们进行套接字编程时往往只关注数据通信&#xff0c;而忽略了套接字具有的不同特性。但是…...

AI日报 - 2024年05月13日

&#x1f31f; 今日概览 (60秒速览) ▎&#x1f680; 技术突破 | Flow-GRPO将在线RL引入流匹配模型&#xff0c;提升性能并降低训练成本&#xff1b;「层内循环」(ILR)技术无需增加参数即可提升Transformer性能。▎&#x1f4ac; 行业热议 | ICML强制作者参会政策引发广泛争议…...

开发工具分享: Web前端编码常用的在线编译器

1.OneCompiler 工具网址&#xff1a;https://onecompiler.com/ OneCompiler支持60多种编程语言&#xff0c;在全球有超过1280万用户&#xff0c;让开发者可以轻易实现代码的编写、运行和共享。 OneCompiler的线上调试功能完全免费&#xff0c;对编程语言的覆盖也很全&#x…...

Android学习总结之线程池篇

一、线程池参数调优实战真题 真题 1&#xff1a;直播 APP 弹幕加载线程池设计 题目描述&#xff1a;直播 APP 需要实时加载弹幕数据&#xff08;网络请求&#xff0c;IO 密集型&#xff09;&#xff0c;同时渲染弹幕视图&#xff08;UI 操作需切主线程&#xff09;&#xff0…...

03.Golang 切片(slice)源码分析(二、append实现)

Golang 切片&#xff08;slice&#xff09;源码分析&#xff08;二、append实现&#xff09; 前言&#xff1a; Golang 切片&#xff08;slice&#xff09;源码分析&#xff08;一、定义与基础操作实现&#xff09; 在前面的文章我们介绍了&#xff0c;切片的结构体与创建\扩容…...

Python实例题:pygame开发打飞机游戏

目录 Python实例题 题目 pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本 代码解释 初始化部分&#xff1a; 游戏主循环&#xff1a; 退出部分&#xff1a; 运行思路 注意事项 Python实例题 题目 pygame开发打飞机游戏 pygame-aircraft-game使用 Pygame 开发…...

MySQL创建了一个索引表,如何来验证这个索引表是否使用了呢?

MySQL创建了一个索引表,如何来验证这个索引表是否使用了呢&#xff1f; 1. 使用 EXPLAIN 分析查询执行计划 在 SQL 查询前添加 EXPLAIN 关键字&#xff0c;查看 MySQL 优化器是否选择了你的索引。 示例&#xff1a; EXPLAIN SELECT * FROM db关键输出字段&#xff1a; typ…...

Go语言多线程爬虫与代理IP反爬

有个朋友想用Go语言编写一个多线程爬虫&#xff0c;并且使用代理IP来应对反爬措施。多线程在Go中通常是通过goroutine实现的&#xff0c;所以应该使用goroutine来并发处理多个网页的抓取。然后&#xff0c;代理IP的话&#xff0c;可能需要一个代理池&#xff0c;从中随机选择代…...

Linux文件编程:操作流程与内核机制

在 Linux 操作系统中&#xff0c;一切皆文件&#xff0c;这意味着从硬盘上的数据文件、设备驱动、到管道、套接字等都以文件的形式存在。Linux 的文件系统将这些不同类型的文件统一抽象成文件对象&#xff0c;允许程序通过文件描述符来访问它们。 一、核心概念解析 文件描述符…...

用短说社区搭建的沉浸式生活方式分享平台

你是否想打造一个融合小红书式种草基因与论坛深度互动的全新社区&#xff1f;本文依托短说社区论坛系统的社区功能规划&#xff0c;一起来规划&#xff0c;如何搭建一个集内容分享、社交互动、消费决策于一体的沉浸式生活社区。 短说社区的界面样式支持普通资讯列表或瀑布流列…...

【ASR学习笔记】:语音识别领域基本术语

一、基础术语 ASR (Automatic Speech Recognition) 自动语音识别&#xff0c;把语音信号转换成文本的技术。 VAD (Voice Activity Detection) 语音活动检测&#xff0c;判断一段音频里哪里是说话&#xff0c;哪里是静音或噪音。 Acoustic Model&#xff08;声学模型&#xff0…...

2025年best好用的3dsmax插件和脚本

copitor 可以从一个3dsmax场景里将物体直接复制到另一个场景中 Move to surface 这个插件可以将一些物体放到一个平面上 instancer 实体器&#xff0c;举例&#xff1a;场景中有若干独立的光源&#xff0c;不是实体对象&#xff0c;我们可以使用instancer将他变成实体。 paste …...

电厂除灰系统优化:时序数据库如何降低粉尘排放

在环保要求日益严苛的当下&#xff0c;电厂作为能源生产的重要主体&#xff0c;其除灰系统的运行效率与粉尘排放控制效果紧密相关。传统除灰系统在数据处理和排放控制方面存在一定局限性&#xff0c;而时序数据库凭借对时间序列数据的高效存储、处理和分析能力&#xff0c;为电…...

upload-labs通关笔记-第2关 文件上传之MIME绕过

目录 一、MIME字段 1. MIME 类型的作用 2. 常见的 MIME 类型 二、实验准备 1.构造脚本 2.打开靶场 3.源码分析 三、修改MIME字段渗透法 1.选择shell脚本 2.bp开启拦截 3.上传脚本bp拦包 4.bp改包 5.获取脚本地址 6.获取木马URL 7.hackbar渗透 8.蚁剑渗透 本文通…...

未来技术展望:光子量子计算集成与连续变量可视化

光子量子计算作为量子计算的重要分支,凭借其独特的光子传输优势和连续变量编码方式,正在量子计算领域掀起新的技术革命。以Xanadu公司的Borealis光量子处理器为代表,连续变量量子计算的可视化技术将面临全新的挑战与机遇。以下从技术适配、可视化方法及工具开发三个维度展开…...

vite项目使用i18n-ally未读取到文件

前言 在使用 Vue CLI 创建的Vue 3项目中&#xff0c;语言文件&#xff08;src/lang/zh.js和en.js&#xff09;正常加载。 .vscode/settings.json如下&#xff1a;i18n-ally.enabledParsers中增加了js {"i18n-ally.localesPaths": ["src/i18n","src/…...

yarn workspace使用指南

作用 Yarn workspace 是 Yarn 包管理工具中的一个功能&#xff0c;主要用于管理多包项目&#xff08;monorepo&#xff09;。它的主要作用如下&#xff1a; 支持多包结构&#xff1a;允许在一个仓库中管理多个独立的包或项目。项目间依赖管理&#xff1a;方便地在不同包之间添…...

Spring Boot 参数验证

一、依赖配置 首先确保在 pom.xml 中添加了以下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency> 这个依赖包含了 Hibernate Valida…...

Electron学习大纲

Electron 实际工作学习大纲路线,结合技术原理、实战开发与工程化最佳实践,分为 5 大核心阶段,每个阶段包含关键知识点和实践目标,帮助快速掌握桌面应用开发能力: 阶段一:Electron 基础与环境搭建(1-2周) 核心概念与架构Electron 组成: 主进程(Main Process):控制应…...