自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 算法随笔(一)

本文包含两个算法问题:1.油车最远行驶问题:通过多车协同加油策略,计算出4辆容量12升的油车能使1辆车最远行驶25公里。方法是分阶段淘汰车辆并转移燃油,每阶段行驶距离为12/当前车辆数。2.树形结构构建与打印:给定扁平节点列表(含父子ID关联),通过构建父节点映射和递归打印,实现带缩进的树状可视化。核心步骤包括建立父节点到子节点的哈希映射、查找根节点,以及递归打印带缩进层级的子节点。文末提供了完整的Java实现代码,可输出部门层级结构。

2025-09-04 23:37:42 701

原创 关于我在一个优惠券系统中rocketMQ消息幂等性自定义注解的处理

本文介绍了一种基于注解和AOP的幂等性控制方案。通过自定义@MQIdempotent注解,包含keyPrefix、key(SpEL表达式)和expireTime三个参数,实现对业务方法的幂等控制。核心实现包括:1)IdempotentAspect切面,使用Lua脚本原子性地执行Redis的setnx和expire操作;2)SpELUtil工具类解析方法参数生成唯一Key。应用示例展示了如何通过注解参数组合(如"order:#request.userId"),确保同一用户短时间内只能成功下

2025-08-28 16:36:36 258

原创 分布式事务理论基础及常见解决方案

分布式系统事务一致性面临两大核心理论:CAP理论指出一致性、可用性和分区容错性不可兼得,需根据场景取舍;BASE理论则提倡基本可用、柔性状态和最终一致性。常见解决方案包括强一致性的2PC/XA协议和最终一致性的TCC、SAGA、本地消息表等模型。选择时需考虑业务需求(如金融系统需强一致性,电商可接受最终一致性)、读写比例和系统容错机制,在一致性和可用性之间取得平衡。

2025-07-02 22:10:07 973

原创 Java 线程池总结

文章摘要: Java线程池(ThreadPoolExecutor)通过复用线程、控制并发量及任务队列机制,解决频繁创建销毁线程的资源消耗问题。其核心设计包括:1)任务调度流程(优先核心线程→入队→扩容→拒绝);2)Worker线程管理(创建/回收/执行循环);3)生命周期与拒绝策略(如AbortPolicy、CallerRunsPolicy)。线程池适用于高并发场景,配置需结合任务类型(CPU/IO密集)选择队列类型(如SynchronousQueue)和参数(核心线程数≈CPU核心数)。其智能调度与弹性扩

2025-06-28 17:38:37 945

原创 “代码没错就是慢?”——一次 Java 并发踩坑引发的性能深挖

摘要:本文揭示了一个常见的Java并发性能问题——伪共享(False Sharing)。通过示例代码展示了两个线程分别自增独立volatile变量时出现的性能下降现象,解释其成因是CPU缓存行机制导致无关变量的缓存互相影响。文章深入分析了MESI缓存一致性协议和volatile的双重作用,并提供了三种解决方案:手动填充变量、使用@Contended注解以及变量隔离存储。该问题隐蔽性强但对性能影响巨大,开发者需要理解底层硬件机制才能编写高效的并发程序。

2025-06-27 11:31:07 2213

原创 Java 并发神器:彻底搞懂 ConcurrentHashMap 底层原理与线程安全机制

摘要:本文深入剖析ConcurrentHashMap的线程安全实现机制,比较JDK1.7(Segment分段锁)和1.8(CAS+synchronized)版本差异。重点讲解1.8版本的桶级锁粒度、无锁读设计(volatile保证可见性)、扩容机制等核心原理,分析其相比HashMap和Hashtable的性能优势。文章还解答了常见面试问题,如为什么get()无需加锁、为何采用CAS而非ReentrantLock等,为理解高并发集合实现提供了技术参考。

2025-06-26 13:29:52 1097

原创 Spring Boot 实现微信扫码登录(无需内网穿透)的实战总结

本文分享了微信扫码登录的实现经验,指出标准OAuth2授权流程中并不需要内网穿透。作者通过前端获取授权码并转发给认证服务的方案,详细解析了换取token、获取用户信息等关键步骤,强调只要前端能访问认证服务即可完成流程。文章对比了不同场景的需求,说明只有在微信服务器主动回调时才需要公网地址,为开发者提供了实用的技术参考方案。

2025-06-20 20:30:01 1017

原创 面试官问我:“为什么不用 Java 的 Map 缓存 JSON,而用 Redis Hash?”

【摘要】本文探讨Java Map与Redis Hash在缓存中的适用场景差异。Java Map作为本地缓存,存在单机局限、无法共享数据、缺乏持久化和内存管理等问题;而Redis Hash作为分布式缓存,支持跨服务共享、字段级操作、TTL过期策略和数据持久化,更适合缓存结构化JSON数据。通过对比两者的存储本质、数据持久化、内存管理和局部更新能力,得出结论:业务场景决定技术选型,Redis Hash更适合分布式系统中的结构化数据缓存。技术决策应基于实际需求,而非单纯追求性能。

2025-06-20 00:13:26 813

原创 Redis 核心数据类型及典型使用场景详解

Redis核心数据类型解析:深入理解五种基础数据类型的底层实现与应用场景。文章详细介绍了String(缓存/计数器)、Hash(结构化对象)、List(队列/消息)、Set(去重统计)和ZSet(排行榜)的特点与典型用法,给出类型选择建议,强调避免大Key、合理分页、设置TTL等实践要点。通过掌握这些数据结构的特性,开发者可以更高效地利用Redis构建健壮系统。文中还预告了后续将分享Redis高级特性。

2025-06-17 23:59:06 1127

原创 Java 内存管理详解:一文搞懂 JVM 的“分区套路”

Java内存管理是程序性能优化的关键。文章系统讲解了JVM内存结构:线程私有的程序计数器、虚拟机栈(含栈溢出问题)和本地方法栈;共享的堆内存(分新生代/老年代)和方法区(JDK8后改为元空间)。特别分析了字符串常量池、直接内存等特殊区域的作用,并针对各类内存溢出问题(堆OOM、栈溢出、元空间OOM等)给出解决方案。理解内存分区机制有助于快速定位性能问题,合理设置JVM参数,是Java开发者必备的底层知识。

2025-06-13 16:29:46 1007

原创 java面试中关于线程有什么知识点

Java多线程与并发编程面试要点精粹: 本文系统梳理了Java多线程核心知识点,涵盖基础概念、线程同步、线程池使用、并发工具及JMM模型等面试高频内容。重点包括:4种线程实现方式(推荐Runnable/Callable/线程池)、线程生命周期五大状态、同步机制(synchronized/volatile/Lock)、线程池参数配置(核心三参数:corePoolSize/maxPoolSize/workQueue),以及JUC工具包中的CountDownLatch/CyclicBarrier等实用组件。特别解

2025-06-12 14:22:48 1032

原创 深入理解乐观锁与悲观锁:原理、区别与实战示例

《高并发系统中的锁机制选择:乐观锁与悲观锁解析》摘要 本文系统分析了高并发场景下的两种主流并发控制方案。悲观锁采用"先加锁后访问"策略(如SELECT...FORUPDATE),适合数据强一致性场景;乐观锁通过版本号/CAS实现无锁检测(如MyBatis-Plus的@Version),适用于读多写少的高吞吐系统。文章从原理、性能影响、实现方式(含Java代码示例)等维度对比两种方案,并给出电商秒杀、银行转账等典型场景的选型建议。核心结论指出:高冲突场景用悲观锁,低冲突高并发场景宜用乐观锁

2025-06-08 19:05:27 824

原创 Microsoft Visual Studio2022下载安装详细教程

VisualStudio是由微软开发的强大集成开发环境(IDE),支持C++、C#、Python等多语言开发,提供智能代码补全、调试工具、版本控制等功能。具备跨平台开发能力,支持Windows、Web、移动应用及游戏开发。提供社区版(免费)、专业版和企业版三个版本可选。安装时需选择相应工作负载(如.NET、C++或Python开发),注意安装路径不能含中文且需与系统环境文件分开存放。安装完成后可免费试用30天。提供官网及多个网盘下载渠道。

2025-06-07 22:19:57 7467

原创 [特殊字符] ThreadLocal 是 JVM 中的隐秘力量,真的懂了吗?

ThreadLocal是Java中实现线程数据隔离的关键工具,通过为每个线程创建独立变量副本避免多线程竞争。其核心原理是每个Thread对象内置ThreadLocalMap存储数据,采用弱引用Key防止内存泄漏。典型应用包括请求上下文管理、数据源路由等。使用时需注意内存泄漏风险,务必在finally块中调用remove()方法清理数据。面试考察重点应涵盖其隔离机制、底层结构(ThreadLocalMap)、应用场景及潜在风险,展现对多线程编程的深入理解。

2025-06-06 16:09:25 949

原创 [特殊字符]Java 与操作系统视角下的进程与线程:面试必问核心解析

本文从操作系统和Java角度解析进程与线程的区别与联系。进程是资源分配的基本单位,拥有独立内存空间;线程是执行的最小单位,共享进程资源。Java线程1:1映射操作系统线程。文章对比了二者在内存、开销、通信等方面的差异,并给出面试常见问题的解决方案,如线程安全处理、线程间通信等。还介绍了线程池优化和JVM线程类型。核心观点:线程是进程的执行单元,共享堆内存但独立栈空间,需通过同步机制保障安全,适合高并发场景。

2025-06-05 11:35:58 1135

原创 ☕ Spring AOP 源码剖析:代理模式选择机制揭秘

Spring AOP代理选择机制解析:默认优先使用JDK动态代理(需目标类实现接口),当配置proxyTargetClass=true、optimize=true或无接口时自动切换为CGLIB(基于继承方式)。Spring Boot通过spring.aop.proxy-target-class配置默认策略,并引入Objenesis解决CGLIB构造限制。建议根据场景选择:接口方法用JDK代理,类方法或事务注解需开启CGLIB,注意final类/方法无法被代理。理解该机制能有效避免AOP失效等问题。

2025-06-04 14:45:29 830

原创 JDK 动态代理 vs CGLIB:原理、区别与实践指南

本文详细对比了Java中的两种动态代理方式:JDK动态代理和CGLIB代理。JDK代理基于接口实现,使用反射机制,要求目标类必须实现接口;CGLIB通过字节码生成子类,不依赖接口但无法代理final类。两者在Spring中的选择策略不同:有接口用JDK,无接口用CGLIB。性能方面,JDK8+调用更快,CGLIB初始化稍慢。文章通过代码示例展示了具体使用方式,并给出建议:优先JDK代理(接口情况),非接口场景用CGLIB(注意final限制)。SpringAOP能自动选择合适代理方式,实际开发中建议使用其封

2025-06-03 08:37:40 1637

原创 深度解析 AopContext.currentProxy() 的底层代码设计与设计思想

本文深入解析了Spring AOP中AopContext.currentProxy()的核心机制,揭示了其解决自调用失效问题的关键作用。通过ThreadLocal实现线程隔离的代理对象存储,配合exposeProxy=true配置,该方法能在方法内部获取当前代理对象。文章详细剖析了源码实现、设计动因、使用场景和限制,指出其体现了Spring延迟绑定、上下文隔离等架构理念。作为框架级扩展接口,currentProxy()展示了Spring最小入侵的设计哲学,是解决事务增强丢失等AOP特殊场景的重要工具,但需谨

2025-06-03 08:28:08 2145 1

原创 从一个点来详细说说事务失效的场景及解决办法

摘要:文章分析了Spring事务失效的常见原因——同类方法自调用导致跳过代理机制,从而使@Transactional注解失效。通过实际案例展示了问题场景,解释了代理机制原理,并提供了三种解决方案:注入自身代理、抽离到独立Service和使用AopContext.currentProxy()。特别强调最佳实践是将网络IO与数据库操作分离,避免长事务问题,建议仅在必需的数据操作上添加事务注解。文章还总结了事务生效的四个关键点,包括调用方式、方法可见性、异常类型处理等注意事项。

2025-06-02 20:53:19 804

原创 Spring Boot 中 AopContext.currentProxy() 的妙用:解决自调用切面失效问题

摘要:Spring AOP自调用问题(如方法内部调用导致@Transactional失效)可通过AopContext.currentProxy()解决。需在配置类添加@EnableAspectJAutoProxy(exposeProxy=true),然后通过((ClassName)AopContext.currentProxy()).method()调用。该方案通过代理对象确保切面生效,但需注意代理类型(JDK/CGLIB)和性能开销。替代方案包括拆分Bean或自注入代理对象。本文详细介绍了问题成因、解决方

2025-06-02 20:50:15 778

原创 Java中HashMap底层为什么用2的倍数来扩容

摘要: HashMap采用2的幂次方容量设计,通过位运算(&)替代模运算(%)来高效计算数组下标,提升性能。当数组扩容时,元素只需判断哈希值的特定位即可确定新位置,无需重新哈希。这种设计还能减少哈希冲突,使数据分布更均匀。2的幂次方容量结合位运算,实现了快速定位、高效扩容和优化散列,体现了HashMap的工程优化思想。

2025-05-29 20:25:15 1180 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除