- 博客(116)
- 收藏
- 关注
原创 开发避坑指南(72):HttpHeaders 的add()方法和set()方法有什么区别?
springframework中的HttpHeaders 的add()方法和set()方法有什区别?
2025-11-22 10:39:58
145
原创 开发避坑指南(71):mybatis-plus 各种Wrapper类区别
mybatis-plus中 QueryWrapper、LambdaQueryWrapper、UpdateWrapper、LambdaUpdateWrapper、MPJQueryWrapper、MPJLambdaWrapper有什么区别?
2025-11-21 16:44:45
245
原创 开发避坑指南(70):Vue3 Http请求头携带token下载pdf文件解决方案
Vue3中http请求如何下载预览pdf文件?请求头中如何携带token?
2025-11-21 16:07:45
232
原创 并发编程原理与实战(三十八)高并发利器ConcurrentHashMap 数据结构与核心API深度剖析
本文分析了ConcurrentHashMap的核心数据结构和API方法。其数据结构采用数组+链表+红黑树的形式,包含基础Node节点和四个子类节点:TreeBin/TreeNode用于红黑树管理、ForwardingNode处理扩容转发、ReservationNode作为计算操作的占位符。核心方法putVal()通过CAS+synchronized实现线程安全,支持链表转红黑树等优化操作。这些设计共同构成了ConcurrentHashMap高效并发的基础架构。
2025-11-20 20:29:37
1046
2
原创 并发编程原理与实战(三十七)高并发利器ConcurrentHashMap核心特性解析
1、引入ConcurrentHashMap主要是为了解决HashMap在多线程环境下的线程安全问题,并克服Hashtable因全局锁导致的性能瓶颈。2、一个支持检索操作完全并发且更新操作具有高预期并发性的哈希表。所有操作都是线程安全的,但检索操作不涉及锁机制,且不支持锁定整个表以阻止所有访问。3、检索操作反映的是在其开始时已完成的最近更新操作的结果。4、当发生过多碰撞(即具有不同哈希码但根据表大小取模后落入同一槽位的键)时,哈希表会动态扩容。
2025-11-20 11:25:38
687
原创 开发避坑指南(69):FastJSON 解析非标准 JSON 数据异常排查与解决方案
使用fastjson解析JSON报错,问题出在bmInfo节点的数据结构异常 - 数组内混合了对象和数组类型,不符合标准JSON格式。解决方案是将bmInfo字段类型改为List<List<Object>>,而非List<List<JsonData>>。这样能兼容JSON解析器对混合数据结构的处理需求,解决解析异常问题。
2025-11-11 20:50:08
190
原创 并发编程原理与实战(三十六)深入解析 ThreadLocal 在 Spring 框架中的核心应用与实战技巧
摘要:本文探讨了ThreadLocal在Spring框架中的核心应用场景,包括用户信息存储和数据库连接管理。在Web应用中,通过ThreadLocal实现拦截器存储用户信息,避免参数传递;在数据库事务中,Spring通过NamedThreadLocal管理连接资源,确保同一线程使用相同的Connection对象。文章还分析了Spring事务管理的调用链,解释了CGLIB代理的选用原因。这种线程本地变量机制有效解决了多线程环境下的数据隔离问题,是Spring框架的重要实现基础。
2025-11-11 20:45:09
1151
原创 开发避坑指南(68):Java Stream 统计List中元素某个字段值不同的次数实战指南
java 中如何用Stream 统计List中元素某个字段值不同的次数?
2025-11-04 17:27:45
175
原创 并发编程原理与实战(三十五)ThreadLocal内存泄露问题剖析与典型使用场景举例
摘要:本文分析了ThreadLocal内存泄漏问题,指出其根本原因在于ThreadLocalMap中Entry的key采用弱引用(ThreadLocal对象)而value是强引用,导致key被回收后value仍占据内存。通过示例演示了未调用remove()方法时老年代内存持续增长的现象,并提出了防护策略:1)显式调用remove()清理;2)使用static final修饰ThreadLocal;3)设置合理初始值。文中还详细介绍了Java四种引用类型及其特性,为理解内存泄漏机制提供了理论基础。
2025-11-04 00:04:03
874
原创 SpringBoot + iTextPDF + Acrobat 构建动态PDF表单的完整实践
本文介绍了使用iTextPDF和Acrobat工具实现动态PDF表单打印的解决方案。文章分析了表单开发中的5个关键问题:SpringBoot整合iTextPDF的依赖引入、文本域纵向展示设置、Barcode128条形码生成与插入、条形码的横向/纵向排列实现。 实现过程详细说明了: 引入iTextPDF 5.x或7.x版本的依赖配置 通过Acrobat设置文本域90度旋转实现纵向展示 使用Barcode128类生成条形码,并通过PdfCanvas进行坐标变换 通过矩阵变换(concatMatrix方法)实现条
2025-10-30 21:59:29
682
原创 开发避坑指南(66):IDEA 2025 Gradle构建安全协议警告:Maven仓库HTTPS切换或允许HTTP的配置方法
Gradle 7.0 版本构建项目以上就会出现这个问题,Gradle从高版本开始默认禁止使用不安全的HTTP协议访问Maven仓库所致。2、修改build.gradle配置,显式允许不安全协议。1、将仓库访问地址由http修改为https。
2025-10-24 17:31:01
281
原创 开发避坑指南(64):修复IllegalArgumentException:参数值类型与期望类型不匹配
在进行sql传参的时候报错,从异常信息可以看出,传入的参数82和期望的Long类型的参数不一致,因为传入的是字符串类型,所以报类型不匹配错误。根据实际类型调整传入参数的类型。
2025-10-21 23:19:10
319
原创 并发编程原理与实战(三十四)ThreadLocal核心API与线程安全数据隔离机制深度解析
通过分析ThreadLocal的核心API,我们总结出ThreadLocal线程安全的数据隔离机制:1、ThreadLocal通过为每个线程创建独立的局部变量来实现线程安全的数据隔离,其核心机制基于Thread、ThreadLocal和ThreadLocalMap三者的协作。2、每个Thread对象内部维护一个ThreadLocalMap实例作为线程的私有存储空间。
2025-10-21 19:38:24
1442
原创 开发避坑指南(63):解决SQL排序子句列名歧义异常:Column ‘xxx‘ is ambiguous
在使用jdbc多表连接查询的时候发生上述错误,该异常表明SQL中ORDER BY子句中出现了不明确的’id’列名,通常发生在多表联查时多个表存在相同列名但未明确指定表别名的情况下。该问题与字段列表歧义异常(如Column ‘id’ in field list is ambiguous)本质相同,均属于SQL编写规范问题。ORDER BY子句中显式指定表别名:order by t_order.id。SQL规范:建议所有多表查询都显式指定列所属表,即使当前无歧义,以避免后续表结构变更导致的潜在问题。
2025-10-20 23:49:55
174
原创 开发避坑指南(62):解决URLDecoder:Illegal hex characters in escape (%) pattern 异常
该异常是由于URLDecoder在解码时遇到非法十六进制字符导致的,具体表现为字符串中的"%"被误认为是URL编码的起始符号,但后续字符"食品"不符合十六进制编码格式。URLDecoder要求%后必须跟随两个十六进制字符(0-9/a-f/A-F)才能正常解码。检查 % 后是否不跟随两位十六进制字符(0-9、a-f、A-F)。若符合(如 %20),则保留原样。使用正则表达式预处理字符串,将“%”替换成 URL 编码中的百分号编码“%25”,替换后不需要跟两个十六进制字符,确保百分号正确传递。
2025-10-20 23:48:43
234
原创 开发避坑指南(61):Redis持久化失败:RDB快照因磁盘问题无法保存解决方案
修改配置文件:编辑redis.conf文件,找到stop-writes-on-bgsave-error配置项,将其值从yes改为no,然后重启Redis服务使配置生效。该错误表明Redis配置了RDB快照保存功能,但当前无法将数据持久化到磁盘。关闭写入保护:通过Redis命令行执行以下命令,允许在RDB快照失败时继续执行写操作。检查磁盘空间:确认Redis数据目录所在磁盘是否有足够空间。检查Redis日志:查看Redis日志获取具体错误信息。检查权限问题:确保Redis进程对数据目录有写入权限。
2025-09-30 22:41:50
256
原创 开发避坑指南(60):Mysql导入数据报错ERROR 2006 (HY000) MySQL server has gone away解决方案
interactive_timeout控制服务器关闭交互式连接(如命令行客户端)前的空闲等待时间,默认同样为28800秒。需注意,当两者同时设置时,交互式连接会优先采用interactive_timeout的值。max_allowed_packet限制MySQL服务器和客户端之间通信数据包的最大容量,默认通常为4MB-16MB,最大可设为1GB(1073741824字节)。执行以下命令临时修改非交互式连接前等待活动的秒数、服务器关闭交互式连接前的空闲等待时间、服务器和客户端之间通信数据包的最大容量。
2025-09-30 22:38:48
352
原创 并发编程原理与实战(三十三)AQS框架下手写简易可重入锁的实战解析
本文基于AQS框架实现自定义可重入锁,分析锁的核心特性(可重入性、公平性、中断机制等)及其实现方式。通过创建继承AQS的Sync内部类,重写tryAcquire、tryRelease等方法,利用AQS提供的state状态管理和CLH队列实现线程同步。代码实现部分展示了如何构建Lock接口的基本框架,并重点解析了独占模式下关键方法的实现逻辑,为深入理解锁机制和AQS原理提供了实践案例。
2025-09-29 19:39:14
1073
原创 开发避坑指南(57):Java Stream List转Map实战指南
Java 中如何将List转换成以List元素某个属性为key,整个元素为value的Map?
2025-09-25 19:23:30
234
原创 并发编程原理与实战(三十二)AQS核心机制与使用示例解读
前面的系列文章,我们主要学习了线程基础、线程并发协同工具类、线程安全、锁、原子类等内容。有了前面的这些知识,接下来我们来学习Java并发编程中线程协作工具统一的底层框架AbstractQueuedSynchronizer,简称AQS。
2025-09-24 19:32:44
1298
原创 开发避坑指南(56):IDEA2025.1.3新版本,这样配置工具栏,常用操作速度提升50%
IDEA2025.1.3的工具栏分成Left,Center,Rigth三部分,那么 如何定制工具栏,将常用操作放在工具栏中,以便快速操作?
2025-09-23 21:45:57
314
原创 开发避坑指南(55):基于路由守卫的Vue2/Vue3 Tab页查询状态保留方案
在Vue2/Vue3页面开发过程中,经常需要遇到切换tab页面后,原页面刷新,然后查询条件被清空的问题,很不友好。那么Vue2/Vue3中如何实现切换tab页面后不刷新页面,保留上一次的查询条件?
2025-09-23 19:40:35
351
原创 开发避坑指南(52):IDEA 2025.1.3 顶部显示类完整路径的设置方法
idea 2025.1.3 顶部显示类完整路径,方便快速查看类所在路径,如何设置?
2025-09-21 21:21:35
383
2
原创 并发编程原理与实战(三十一)从原子类到CPU原子指令,CAS实现全链路拆解
在前面学习原子类的核心API过程中,CAS方法compareAndSet(int expect, int update)是每个原子类的核心方法,本文来深入这一核心算法底层的实现原理。
2025-09-21 19:37:49
1143
原创 开发避坑指南(50):Java解析yyyyMMddHHmmssSSS格式的时间字符串成yyyy-MM-dd HHmmss格式的日期的方法
java如何解析yyyyMMddHHmmssSSS(20160330184802222)格式的时间字符串成yyyy-MM-dd HH:mm:ss格式的日期。
2025-09-19 17:17:46
169
原创 开发避坑指南(49):Java Stream 对List中的字符串字段求和
总有一些同志把数值型的字段定义成字符串型给你挖坑,那么java中如何用stream对list中的varchar类型的字段求和?
2025-09-18 20:34:19
197
原创 并发编程原理与实战(三十)原子操作进阶,原子数组与字段更新器精讲
上两篇文章学习了int、long、boolean三种基本数据类型以及引用数据类型对应的原子类。JDK中对这几种数据类型的数组提供了相应的原子类,文本就来学习数组的原子类。
2025-09-18 20:20:06
1005
原创 并发编程原理与实战(二十九)原子引用类型详解、ABA问题原理与防护策略
上一篇学习了AtomicInteger的核心api,本文继续学习原子引用类型。
2025-09-17 19:42:33
866
原创 开发避坑指南(48):Java Stream 判断List元素的属性是否包含指定的值
Java Stream 判断List元素的属性是否包含指定的值该怎么实现?
2025-09-12 23:20:46
284
原创 开发避坑指南(47):IDEA 2025.1.3 运行main函数报错:CreateProcess error=206, 文件名或扩展名太长的解决方案
IDEA 2025.1.3 运行main函数报错:CreateProcess error=206, 文件名或扩展名太长。
2025-09-12 23:04:55
319
原创 开发避坑指南(46):Java Stream 对List的BigDecimal字段进行求和
对int,long类型的数据求和直接用stream().mapToInt()、stream().mapToDouble(),可是没有stream().mapToBigDecimal()这样的方法,那么如何用stream对List的BigDecimal字段进行求和?
2025-09-11 21:53:50
432
原创 并发编程原理与实战(二十八)深入无锁并发演进,AtomicInteger核心API详解与典型场景举例
Java原子类演进背景及核心类详解 摘要:为应对高并发场景下传统锁机制的性能瓶颈,Java 1.5引入原子类(Atomic Classes)。原子类基于CAS实现无锁并发,避免了线程阻塞,提供轻量高效的同步方案。核心原子类AtomicInteger、AtomicLong和AtomicBoolean针对基本数据类型提供原子操作。以AtomicInteger为例,其核心方法包括: 初始化方法:支持指定初始值或默认0值 值操作:set/get方法实现变量访问 原子增减:getAndIncrement()等系列方法
2025-09-10 20:16:59
1310
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅