- 博客(311)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 ReentrantLock源码中公平锁和非公平锁的差异比较
ReentrantLock的公平锁与非公平锁核心差异在于获取锁的顺序策略。公平锁(FairSync)严格遵循先到先得原则,锁释放时优先唤醒队列中队首线程,新线程直接排队;非公平锁(NonfairSync)允许"插队",新线程可尝试直接CAS抢锁(提供两次插队机会),可能导致队列线程饥饿。关键代码差异体现在lock()入口和tryAcquire逻辑:非公平锁在lock()时立即尝试CAS抢锁,而公平锁直接进入队列;tryAcquire时非公平锁不检查队列直接CAS,公平锁需先验证队列
2025-11-18 14:39:54
278
原创 可重入锁ReentrantLock源码深度解析
ReentrantLock是可重入锁,允许同一线程多次获取同一把锁。其核心基于AQS框架,通过state字段记录锁状态和重入次数。获取锁时,非公平锁会先尝试直接CAS抢锁,失败才进入队列;公平锁则会检查队列,确保先来先服务。线程被包装为Node加入CLH队列尾部,通过自旋和阻塞等待唤醒。解锁时释放state并唤醒后继节点。这种设计既保证了线程安全,又支持了锁的可重入特性。
2025-11-18 12:11:43
953
原创 Netty编写Echo服务器
本文介绍了使用Netty框架实现Echo服务器的全过程。服务器端采用主从Reactor线程模型,创建bossGroup(负责连接)和workerGroup(处理I/O)两个事件循环组,通过ServerBootstrap配置NIO通道、编解码器(StringDecoder/StringEncoder)和业务处理器(EchoServerHandler)。客户端使用Bootstrap配置类似组件(EchoClientHandler)。服务端收到消息后会原样返回,展示了Netty的基本网络通信流程。
2025-11-16 23:10:36
593
原创 RabbitMQ四种交换器类型详解及示例
RabbitMQ提供四种交换机类型,适用于不同消息路由场景: Direct交换机:精确匹配路由键,适用于点对点任务分发和RPC调用 Fanout交换机:广播模式,忽略路由键,适用于发布订阅场景 Topic交换机:支持通配符模式匹配,适合基于多维度属性的动态路由 Headers交换机:根据消息头属性匹配,用于复杂路由条件(较少使用)
2025-11-16 17:30:19
981
原创 深入理解MySQL行锁,间隙锁和临键锁
InnoDB锁机制包含行锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-Key Lock)。行锁锁定具体索引记录保证原子性;间隙锁锁定索引区间防止幻读,开区间;临键锁是行锁+间隙锁的组合,左开右闭区间,为InnoDB默认锁模式。示例展示了不同隔离级别和查询条件下的锁定范围,如唯一索引查询会降级为行锁。通过information_schema或performance_schema可查看当前锁信息。这些锁共同实现事务隔离性,防止并发问题。
2025-11-07 20:24:09
540
1
原创 Mysql中隔离级别可重复读解决不可重复读的底层原理是什么?
MySQL通过MVCC机制实现可重复读隔离级别,解决不可重复读问题。核心原理是事务首次读取时创建ReadView快照,后续查询均基于该视图。MVCC包含三个部分:隐藏字段(事务ID、回滚指针)、Undo Log记录数据历史版本、ReadView判断数据可见性。ReadView通过比较事务ID与活跃事务集合来决定可见版本,确保同一事务内读取数据的一致性。例如,当活跃事务修改数据时,其他事务仍能看到修改前的历史版本,从而实现可重复读。
2025-11-06 16:39:41
404
原创 三级缓存为什么解决不了构造器注入的循环依赖?
Spring循环依赖处理机制分析:通过对比Setter注入和构造器注入的流程差异,揭示Spring处理循环依赖的核心机制。Setter注入时,Spring通过三级缓存(提前暴露对象工厂)成功解决循环依赖;而构造器注入由于需要在实例化阶段就完成依赖注入,导致无法提前暴露引用,最终抛出BeanCurrentlyInCreationException。源码分析表明,只有在实例化完成后才会将对象工厂加入三级缓存,这是构造器注入无法解决循环依赖的关键原因。实际测试也验证了这一结论。
2025-10-22 16:03:28
329
原创 Java实现霍夫曼编码对文件解压缩
霍夫曼压缩算法实现包括压缩和解压两个流程。压缩过程通过统计字节频率构建霍夫曼树,生成编码表,将原始数据转换为编码后的二进制位流。解压过程则利用霍夫曼树逆向还原原始数据。核心数据结构是霍夫曼树节点类,包含字节数据、频率和左右子节点。实现细节包括:1) 频率统计和树构建;2) 递归生成编码;3) 位流操作类处理二进制读写;4) 压缩文件头存储频率表和实际位数。该算法通过变长编码有效减少文件体积,适合重复数据较多的场景。
2025-09-28 18:52:20
251
原创 windbg查Socket服务内存占用大排查记录
通过内存分析工具定位Socket服务中未被回收的大字节数组问题。使用!dumpheap查找到两个约788MB的Byte[]对象,通过gcroot发现线程6的recv调用持有引用。最终确定是Socket接收数据时未及时处理导致内存占用,解决方案是增加缓存机制及时取用数据。
2025-09-25 19:12:00
220
原创 记windbg查内存溢出时,执行.loadby sos提示Syntax error in extension string的处理,!dumpheap -stat执行不了
现在加载sos查堆栈信息。习惯性的.loadby sos,发现不能用了。.loadby不需要声明路径,会加载.chain下托管的dll。没有的话,需要指定加载对应版本的sos.dll。dmp是64位的,C:\Windows\Microsoft.NET\Framework64\对应版本\sos.dll。dmp是32位的,C:\Windows\Microsoft.NET\Framework\对应版本\sos.dll。版本差异:可以去电脑找路径对应的版本。
2025-09-22 20:00:00
261
原创 SQLServer死锁监测方案:自定义死锁扩展事件生成
本文介绍如何在SQL Server上创建名为Testxxx的扩展事件会话,专门监控xml_deadlock_report死锁事件。该配置会捕获死锁的完整XML数据,并收集客户端应用名、主机名、数据库名、SQL语句等关键信息。事件数据将写入D盘指定路径的.xel文件,文件最大50MB,保留5个滚动文件。会话设置了10MB内存缓冲、5秒写入延迟等参数,确保在服务器重启后仍自动运行。文末提供了完整的创建和启动会话的SQL脚本。
2025-09-06 08:00:00
547
原创 SQLServer死锁监测方案:如何使用XE.Core解析xel文件里包含死锁扩展事件的死锁xml
对于SQLServer死锁监测的方式,最终选用的方案是自定义的死锁扩展事件在生成本地xel文件,直接对xel文件解析。SQLServer自带两个dll可用于解析xel文件,编程语言选用C#,死锁扩展事件的名为 xml_deadlock_report。解析时需考虑版本问题,SQLServer2008版本需要xel,xem文件。两个DLL: Microsoft.SqlServer.XE.Core.dll, Microsoft.SqlServer.XEvent.Linq.dll。
2025-09-05 20:00:00
382
原创 ssms加载死锁信息扩展事件xel文件时,提示:值不能为 null。 参数名: metadataFiles (Microsoft.SqlServer.XEvent.Linq)
打开xel文件报错。此存储空间未能使用提供的参数进行初始化。(Microsoft.SqlServer.XEventStorage)2.xem文件的生成需要在死锁扩展事件脚本中加入 metadatafile属性 设置为 xem路径。改路径与xel文件路径必须一致。参数名: metadataFiles (Microsoft.SqlServer.XEvent.Linq)1.打开xel文件的根目录上必须附带.xem元数据文件。解决方案:sqlserver2008版本会出现此问题。值不能为 null。
2025-08-29 22:00:00
226
原创 inno setup安装路径根据电脑里安装程序的路径设置
在安装配置文件中,通过遍历注册表获取已安装程序的路径,并返回指定路径作为默认安装目录。具体步骤如下:首先,从注册表的卸载条目中搜索所有已安装程序的路径,根据程序名称进行匹配。如果找到匹配的路径,检查其是否存在,并进一步确认子目录是否存在。如果子目录不存在,则创建该目录。最终,返回该子目录路径作为默认安装路径。此方法支持部分名称匹配,并确保路径的有效性。
2025-05-12 21:04:45
550
原创 C#将文件和字节数组相互转换,字节数组和字符串相互转换
本文介绍了C#中文件和字节数组的相互转换方法。文件转字节数组可使用File.ReadAllBytes或FileStream读取,字节数组转文件可用File.WriteAllBytes或FileStream+BinaryWriter写入。同时展示了字符串与字节数组的转换:通过Encoding.UTF8进行编解码,以及使用BitConverter将字节数组转为十六进制字符串(如"48656C6C6F")。两种方法都提供了简洁的代码示例
2024-06-05 23:18:20
787
原创 图用邻接表表示的深度优先和广度优先遍历
然后,从队列中取出一个顶点进行处理,输出其数据,并将其所有未访问的邻接顶点入队并标记为已访问。它首先将当前顶点标记为已访问,并输出顶点的数据。然后,遍历当前顶点的邻接表,对于每个未被访问过的邻接顶点,递归调用。广度优先遍历(Breadth-First Search,BFS)是一种图遍历算法,它以广度优先的顺序遍历图的所有节点。,每个顶点表项存储了顶点的数据和指向第一个邻接顶点的指针。函数用于遍历图中所有顶点,并对未访问过的顶点调用。,存储了邻接顶点的下标和指向下一个邻接顶点的指针。函数进行深度优先遍历。
2023-12-19 23:18:20
1024
原创 如何前端存token,后端获取token
在身份验证方面,Token通常用于替代传统的基于会话的身份验证机制,如使用Cookie+Session的方式。使用Token进行身份验证的好处是,服务器不需要在内存中保存用户的会话信息,因为Token本身包含了所有验证所需的信息。在前端,使用浏览器提供的 Web Storage(如LocalStorage或SessionStorage)或者使用HTTP Cookie来存储Token。Token是一种用于身份验证和授权的令牌(Token)机制,在网络通信中广泛使用。注解来接收前端传递的Token值。
2023-12-09 12:15:32
9433
原创 Web server failed to start. Port 8888 was already in use.
① 在 Unix/Linux/Mac 上,使用。②在 Windows 上,使用。替换为占用端口的进程ID。替换为占用端口的进程ID。强制终止占用端口的进程。记下显示的进程ID。
2023-12-08 07:00:00
918
原创 BeanUtils.copyProperties将一个 Java 对象的属性值复制到另一个对象
在进行属性拷贝时,如果属性类型不匹配,可以通过注册自定义的转换器来进行类型转换,或者使用其他工具库来实现更复杂的属性拷贝逻辑。是 Apache Commons BeanUtils 库提供的一个工具类,用于简化在 Java 对象之间进行属性拷贝、属性查找和属性赋值的操作。该方法会将源对象中的属性值复制到目标对象中,属性名和类型必须在目标对象中存在。是 Apache Commons BeanUtils 库中的一个方法,用于将一个 Java 对象的属性值复制到另一个对象中。在上面的示例中,创建了一个。
2023-12-05 17:04:21
1438
原创 springboot统一异常处理
通过将全局异常处理器注册为一个 Bean,Spring Boot 将自动应用该处理器来处理应用程序中发生的异常。最后,在 Spring Boot 应用程序的配置类中,需要将全局异常处理器注册为一个 Bean。在 Spring Boot 中,可以通过自定义异常处理器来实现统一的异常处理。方法用于处理其他未处理的异常,返回一个带有 500 错误状态码和错误消息的。或其他未处理的异常时,全局异常处理器将捕获并处理它们,返回适当的错误响应。然后,创建一个全局异常处理器,用于处理应用程序中发生的异常。
2023-12-04 15:12:41
841
原创 mybatis中<association> 和 <collection>
association用于配置一对一的关联关系,表示两个对象之间的关系是一对一的。例如,一个订单对象关联一个用户对象。collection用于配置一对多的关联关系,表示一个对象关联多个对象。例如,一个部门对象关联多个员工对象。
2023-12-01 17:05:09
4783
原创 springboot跨域问题
浏览器实施了同源策略(Same-Origin Policy),这是一种安全机制,限制了来自不同源的页面之间的交互。域名不同:当浏览器中的 JavaScript 代码发起请求时,请求的目标地址与当前页面的域名不同,就会触发跨域问题。使用 Spring Security 进行跨域配置:如果你的应用程序使用了 Spring Security,你可以在配置类中添加跨域配置。端口不同:即使两个页面的域名相同,但如果它们使用了不同的端口,也会被视为跨域请求。),而另一个页面使用的是普通的 HTTP 协议(如。
2023-11-30 16:59:11
1065
原创 mysql常见配置文件参数
MySQL的配置文件通常位于安装目录下的 my.cnf 或 my.ini 文件中。如果应用程序需要处理大量的并发连接,可能需要增加该值,以支持更多的连接。:这是InnoDB存储引擎使用的内存缓冲池的大小。增加该参数的值可以提高数据读取的性能,特别是对于大型数据库。增加该参数的值可以减少日志文件的切换频率,并提高写入性能。:对于使用MyISAM存储引擎的表,该参数定义了索引缓冲区的大小。增加该参数的值可以提高索引的读取性能。增加这些参数的值可以提高处理临时表的性能,特别是对于复杂查询和排序操作。
2023-11-29 15:34:55
851
原创 java stream流map和flatmap的区别
flatMap()操作将每个人员的技能列表转换为一个流,并将多个技能流合并为一个扁平化的流。结果列表为[“Java”, “Python”, “SQL”, “JavaScript”, “HTML”, “CSS”, “C++”, “C#”, “Ruby”]。在这个例子中,map()操作将每个字符串映射为它们的长度,生成了一个新的流。适用于将一个元素展开为多个元素的场景,例如将列表展开为单独的元素,或者将字符串拆分为单词。假设有一个包含多个单词的字符串列表,获取每个单词的长度,并生成一个包含所有单词长度的列表。
2023-11-28 20:00:00
1646
原创 java stream流的执行流程
Stream流是Java 8引入的一种用于处理集合数据的函数式编程概念。它提供了一种流式处理数据的方式,可以进行过滤、映射、排序、聚合等操作。在执行终端操作时,流会根据操作链依次处理每个元素。它会按需处理数据,避免不必要的计算。中间操作:一旦有了流,可以对其进行中间操作。中间操作是对数据进行转换、过滤、映射等处理,但并不会立即执行。创建流:首先,需要有一个数据源,可以是集合、数组、I/O通道等。如果需要对同一数据源进行多个操作链的处理,可以通过创建新的流来实现。这些操作可以连接在一起,形成一个操作链。
2023-11-28 07:00:00
985
原创 Java poi无法导出excel报错Sheet name cannot be blank, greater than 31 chars, or contain any of /\*?[]
使用java poi导出excel表报错。修改excel表名不要带有/ \ *?就可以导出excel了。
2023-10-30 11:00:53
543
原创 队列的基本操作以及C语言实现
1.Enqueue:将元素插入队列尾部。2.Dequeue:从队列头部移除元素。4.IsEmpty:检查队列是否为空。5.IsFull:检查队列是否已满。3.Front:获取队列头部元素。
2023-10-19 00:00:00
472
原创 栈的基本操作以及C语言实现
4.IsEmpty:检查栈是否为空。5.IsFull:检查栈是否已满。1.Push:将元素压入栈顶。2.Pop:从栈顶弹出元素。3.Top:获取栈顶元素。
2023-10-18 19:00:00
382
原创 JavaScript querySelector
方法返回匹配选择器的第一个元素,如果没有匹配的元素,则返回。仅返回匹配的第一个元素。需要选择多个元素使用。是CSS选择器,用于指定要选择的元素。方法,返回所有匹配的元素列表。是要执行选择操作的父元素,
2023-10-18 11:21:11
654
原创 ASP.net后端Controller获取前端select标签选择option选项的值
Request.Form[“mySelect”] 可以获取前端传的name="mySelect"的值。后端Controller。
2023-10-16 19:00:00
593
原创 ASP.net相关目录,相关配置文件和.后缀名解释
Machine.config:Machine.config 是全局的 ASP.NET 配置文件,位于.NET Framework 安装目录的\Config 文件夹下。.config:.config 是各种配置文件的通用后缀名,如 Web.config、App.config 和 Machine.config。Global.asax:Global.asax 是一个全局的应用程序类文件,用于处理应用程序级别的事件,如应用程序的启动和关闭、会话管理、应用程序错误处理等。
2023-10-14 19:00:00
822
原创 SAP报错CX_SY DYN CALL PARAM MISSING
在 ABAP 中,当你定义一个方法时,可以选择将方法的参数标记为可选(可选参数)或必需(必需参数)。如果你不勾选可选参数选项,那么该参数将被视为必需参数,调用该方法时必须提供该参数的值。在运行时,如果你在调用该方法时没有为必需参数提供值,将会引发运行时错误。如果你在方法定义中不勾选参数的可选选项,并且在调用该方法时没有为该参数提供值,将会导致编译错误或运行时错误,具体取决于调用方法的方式。在编译时,如果你在调用该方法的地方没有为必需参数提供值,编译器将会报告错误,指示缺少参数。这将阻止你的程序编译通过。
2023-10-14 11:18:21
798
可以通过后端发送多张图片并且在前端显示吗?
2022-05-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅