- 博客(228)
- 收藏
- 关注
原创 弄清Conditon通知类与AQS的CLH队列是如何协同工作的
Condition是Java并发编程中用于线程协作的接口,通过ReentrantLock.newCondition()创建。它提供比Object.wait()/notify()更灵活的线程等待/唤醒机制,支持await()、signal()等方法。Condition基于AQS实现,其内部维护单向的条件队列,与AQS的双向CLH同步队列分工协作:未获锁线程进入CLH队列,持有锁但条件不满足的线程进入条件队列,被唤醒后转移至CLH队列重新抢锁。这种双队列设计实现了锁竞争与条件等待的分离,确保线程安全的同时
2025-08-09 16:55:52
653
原创 总结-ArrayList的扩容机制和BigDecimal大数的底层
Java集合扩容机制与BigDecimal精度控制 ArrayList扩容机制:初始空数组,首次添加元素扩容至10,后续每次扩容1.5倍(位运算实现),超过Integer.MAX_VALUE-8时特殊处理。HashMap扩容也采用1.5倍策略。 BigDecimal精度问题:解决浮点数二进制存储导致的精度丢失,内部采用整数数组分段存储大数,维护符号、精度等元数据。通过compareTo()比较数值,equals()会同时比较精度。运算时精确处理符号和精度,特别是除法可避免浮点误差
2025-08-09 15:09:18
580
原创 算法-CodeTop(三)
本文解析了多个算法题目的解题思路和代码实现:1. 整数反转问题:通过处理溢出条件和逐位反转实现,重点关注MAX_VALUE和MIN_VALUE的边界情况。2. 约瑟夫环问题:使用递推公式解决破冰游戏,推导出最后存活者的位置。3. 数组排序问题:采用快慢指针将奇数前移。4. 斐波那契数列:展示动态规划和空间优化两种解法。5. 相邻重复字符删除:利用栈结构实现高效删除。6. Excel列名转换:处理从1开始的26进制转换问题。7. 重复子串判断:通过字符串拼接和子串查找的巧妙解法
2025-07-30 22:42:33
1058
原创 Nacos热更新原理
Nacos配置中心采用CRUD机制管理配置信息,支持Derby和MySQL存储核心功能包括:1)配置注册与获取2)长轮询监听机制实现动态刷新(30秒超时+变更触发)3)版本号/MD5校验。服务注册中心需具备服务发现、注册/注销、持久化、热更新和监控能力
2025-07-28 20:51:49
951
原创 一些常见的网络攻击方式
本文系统介绍了多种网络攻击技术及其防御措施。主要内容包括:1. IP欺骗技术,通过伪造IP地址实施攻击;2. SYN Flood攻击原理及防御方法;3. UDP Flood攻击机制与缓解方案;4. HTTP Flood和DNS Flood攻击形式;5. TCP重置攻击的运作方式;6. 中间人攻击的原理与预防;7. 分布式拒绝服务(DDoS)攻击类型及防护策略;8. SQL注入攻击示例与解决方案;9. CSRF跨站请求伪造攻击防范;10. XSS跨站脚本攻击分类和预防措施
2025-07-25 21:57:51
830
原创 什么是ARQ协议
ARQ协议是保证可靠数据传输的基础协议,主要包括停止等待和连续ARQ两种实现方式。停止等待ARQ通过确认和超时机制确保每个分组的可靠传输,但效率较低;连续ARQ采用滑动窗口和累计确认机制提高效率,但存在Go-Back-N问题可能导致大量重传。TCP协议在ARQ基础上进行了重要优化,引入选择性确认、动态超时计算和拥塞控制等机制,显著提升了传输效率和网络适应性。ARQ与TCP的关系是基础与增强的关系,ARQ为TCP提供了基本可靠性保证,而TCP则通过多项创新解决了ARQ的固有缺陷。
2025-07-23 20:44:02
865
原创 常见Hash算法
哈希算法(Hash)是一种将任意长度数据映射为固定长度唯一标识(哈希值)的算法,具有不可逆性,常用于数据完整性验证。哈希算法分为加密哈希(如SHA-256、SHA-3)和非加密哈希(如CRC32、MurMurHash3),前者安全性高但性能较低,后者反之。针对密码存储等安全场景,应采用慢哈希算法(如bcrypt、Argon2)结合加盐技术,通过增加计算成本和内存消耗来抵御彩虹表攻击和暴力破解
2025-07-23 17:08:17
840
原创 TTL+日志的MDC实现简易链路追踪
本文介绍了使用MDC(Mapped Diagnostic Context)实现链路追踪的技术方案。首先展示所需的依赖配置,包括Spring AOP、Hutool工具包和日志组件。然后详细说明了如何通过AOP切面在Controller层生成TraceID并存入MDC上下文,配置日志格式输出TraceID。针对异步场景下MDC上下文丢失问题,提出了使用TTL(Transmittable ThreadLocal)解决方案,包括自定义TTL线程池适配器实现上下文传递
2025-07-22 23:24:01
664
原创 final修饰符不可变的底层
Java中final修饰符的底层实现涉及编译器优化和JVM字节码约束,确保被修饰元素的不可变性或不可重写性。对于类,final通过字节码标记禁止继承;对于方法,禁止重写;对于变量,则保证不可变。基本类型变量可能触发常量折叠优化,引用类型变量保证引用不变但对象内容可变。此外,final在多线程环境中通过内存屏障(写屏障和读屏障)确保构造完成后其他线程能正确看到初始化值,实现线程安全的内存语义。这种机制结合了编译期约束和运行期优化,是Java实现不可变性和线程安全的重要手段。
2025-07-22 23:20:05
523
原创 阿里思想学习-如何优化大事务提交
阿里云RDS针对大事务提交优化提出BinlogCacheFreeFlush功能,解决传统MySQL大事务执行时的性能瓶颈。当大事务产生的binlog超过缓存容量时,传统方式会导致实例阻塞、IO资源耗尽等问题。阿里云通过改造BinlogCache临时文件,使其能直接转为正式binlog文件,采用"预留头部空间+原地转换"的创新设计,避免了数据拷贝和重复计算,将锁持有时间从秒级降至毫秒级,大幅提升大事务处理效率
2025-07-21 16:41:03
1123
原创 如何优化Java的原生反射Method.invoke()
传统反射(Method)性能低下,而MethodHandle和CGLIB通过不同维度的优化,将方法调用性能提升至接近直接调用的水平
2025-07-21 13:35:35
754
原创 一文弄懂阻塞队列ArrayBlockingQueue
Java阻塞队列是并发编程中的重要工具,自JDK1.5引入后不断发展完善。主要实现包括ArrayBlockingQueue(基于数组的有界队列)和LinkedBlockingQueue(基于链表的可选有界队列),以及SynchronousQueue、TransferQueue等特殊队列
2025-07-15 13:10:01
570
原创 高性能网络模式-Reactor和Preactor
本文系统介绍了两种高性能网络编程模式:Reactor和Proactor。Reactor采用同步非阻塞IO,分为单线程、多线程和多Reactor多线程三种实现方案,核心组件包括Reactor(事件监听与分发)、Acceptor(连接处理)和Handler(业务处理)。Proactor基于异步IO,通过内核自动完成IO操作后通知应用处理
2025-07-13 17:38:16
1087
原创 区分三种IO模型和select/poll/epoll
IO多路复用(select/poll/epoll)与三种IO模型(阻塞、非阻塞、异步)的关系是:前者解决单线程高效管理多个Socket连接的遍历问题,后者决定如何处理Socket数据。IO多路复用属于同步IO,通过事件驱动机制避免线程轮询开销。普通IO中一个线程处理一个连接,而IO多路复用让一个线程管理多个连接。演进过程从线程池资源复用到非阻塞轮询,最终发展为更高效的epoll事件监听机制。
2025-07-13 17:30:40
844
原创 操作系统-IO多路复用
Socket网络通信模型摘要 Socket是跨主机进程间通信的核心机制TCP Socket通信流程包括:服务端创建(socket)、绑定(bind)、监听(listen)、接受(accept),客户端通过connect发起连接。内核维护半连接(SYN_RCVD)和全连接(ESTABLISHED)两个队列
2025-07-10 16:48:23
643
原创 操作系统-进程管理
本进程通信方式主要包括管道、消息队列、共享内存、信号量和Socket等。管道分为匿名管道和命名管道,通过文件描述符实现进程间通信,但效率较低。消息队列具有持久化功能但存在数据大小限制。共享内存通过虚拟内存映射提高效率,减少用户态与内核态的数据拷贝。信号量用于进程同步,而Socket可实现跨网络和同主机的进程通信。 进程调度算法包括先来先服务、短作业优先、时间片轮转、多级反馈队列和优先级调度等,各有适用场景。线程数量受虚拟内存空间和系统参数限制,创建线程需分配栈空间
2025-07-09 13:30:31
736
2
原创 什么是软中断
计算机中断是系统响应硬件请求的异步机制,分为硬中断(快速处理硬件请求)和软中断(延迟处理复杂任务)。硬中断会打断当前进程,可能导致中断丢失;软中断通过内核线程执行,解决长时间任务问题。Linux系统通过/proc/softirqs监控软中断类型和分布,top命令可查看CPU软中断负载。网络高负载时,NET_RX中断率会显著上升,可用tcpdump分析流量来源。中断机制提高了系统并发能力,但需平衡响应速度与稳定性。
2025-07-03 22:45:26
967
原创 CPU是如何执行任务的
本文深入剖析了CPU数据读写原理和线程调度机制。在数据读写方面,CPU通过三级缓存架构(L1-L3 Cache)以Cache Line为单位批量读取数据,解释了伪共享问题的成因(多个线程读写同一Cache Line的不同变量导致缓存失效)及解决方案(空间换时间、数据对齐)。在线程调度方面,Linux系统将任务分为实时任务(0-99优先级)和普通任务(100-139优先级),采用完全公平调度算法(CFS)通过虚拟运行时间vruntime实现任务公平执行。
2025-07-03 13:53:36
812
原创 CPU缓存一致性
CPU缓存数据写入主要有两种方式:写直达(Write Through)和写回(Write Back)。写直达每次写操作都会同步更新内存和缓存,实现简单但性能较低;写回只在缓存被替换时才将数据同步到内存,性能更高但需要通过脏标记(Dirty)机制保证最终一致性。多核CPU环境下会出现缓存一致性问题,即不同核心的缓存数据不一致。MESI协议通过四种状态(Modified、Exclusive、Shared、Invalidated)和总线嗅探机制实现了写传播和事务串行化,确保多核缓存的一致性
2025-07-01 22:53:41
920
原创 算法-CodeTop(二)字典序最大最小
本文总结了字典序相关算法问题的解题思路,主要包括维护单调栈、合并数组和比较字典序三个核心方法通过402、316、1081和321四个典型题目,详细讲解了如何利用贪心算法和单调栈处理字典序问题。关键点在于遍历时选择性保留或丢弃元素,保证字典序最优文章提供了多种解法代码,包括数组模拟栈和双端队列实现,并重点解析了321题中pickMax、merge和greater三个核心方法的协同工作逻辑,这些方法组合使用可解决复杂字典序问题
2025-07-01 13:41:23
741
原创 算法-CodeTop(一)
本文解析了多个算法题目,包括版本号比较、字符串相加/相乘、IP地址复原/验证、快速排序、丑数生成以及随机数生成。其中165题通过分割字符串和整数转换比较版本号;415和43题分别处理字符串数字的加减乘运算;93和468题运用回溯和分割法验证IP地址;912题介绍三向切分的快速排序;264题利用指针法高效生成丑数;470题通过随机数组合实现概率均等的随机数生成。各题解均提供核心思路和Java代码实现,涵盖字符串处理、排序、数学运算等常见算法场景
2025-07-01 12:54:46
950
原创 如何写出让CPU跑的更快的代码
CPU缓存(L1 Cache)读取速度比内存快100多倍,通过CacheLine(64字节)批量读取数据。CPU采用"先查缓存后访内存"机制,使用地址映射(组标记+索引+偏移量)定位缓存数据。提高性能的关键在于提升缓存命中率:1)数据缓存优化:顺序访问连续内存(如按行遍历二维数组);2)指令缓存优化:排序后再处理数据以提升分支预测准确率;3)多核优化:使用sched_setaffinity绑定线程到固定核心,避免缓存失效
2025-06-30 13:04:04
1017
原创 磁盘与内存
计算机存储器采用层次结构设计,从最快的寄存器到最慢的硬盘依次为:寄存器、L1/L2/L3高速缓存、内存和SSD/HDD硬盘。CPU内部寄存器速度最快但容量最小,CPUCache采用SRAM芯片,分为三级(L1-L3),访问速度逐级递减。外部存储器中,内存使用需要定时刷新的DRAM芯片,SSD比机械硬盘快10万倍。存储器层级间遵循就近访问原则,CPU读取数据时按寄存器→L1→L2→L3→内存的顺序查询,每层只与相邻层交互。这种设计在速度、容量和成本间取得平衡,寄存器最快但昂贵,硬盘最慢但容量大成本低
2025-06-30 12:58:57
933
原创 CPU是如何执行程序的
计算机系统遵循冯诺伊曼模型,由运算器、控制器、存储器(内存)、输入设备和输出设备组成。CPU包含运算器和控制器,其位宽决定计算能力(32位CPU一次处理4字节,64位处理8字节)。内存以字节为单位线性存储,CPU通过寄存器(通用寄存器、程序计数器、指令寄存器)快速访问数据。总线(地址、控制、数据)连接CPU与内存和其他设备。程序执行时,CPU从程序计数器获取指令地址,读取指令到寄存器执行,周而复始直至程序结束。32位CPU最多支持4GB内存寻址,而64位CPU寻址能力更强
2025-06-30 12:53:49
1435
原创 项目拓展-Spring实现策略类统一管理
本文介绍了一种基于Spring框架的Bean容器管理策略主要包含三个核心类:1) BeanContainer接口定义基础方法;2) DefaultBeanContainer抽象类实现Bean初始化逻辑,结合ApplicationContextAware和InitializingBean接口;3) 两种具体实现:MultipleBeanContainer(管理同类型多个Bean)和SingleBeanContainer(管理单个Bean)
2025-06-21 21:13:27
697
原创 实战-通过Hutool实现双ID链法
本文介绍了使用双ID链法实现MQ消费者幂等的实践方案核心思想是将雪花算法生成的主ID(具有时间特性但存在碰撞风险)与Redis管理的自增序列副ID(全局唯一)结合形成"主ID_副ID"的双ID结构文章详细展示了:1)利用Hutool工具类实现雪花算法,通过IP末段取模生成workerId;2)构建DoubleIdChainUtil类模拟Redis分区存储,用AtomicInteger模拟全局自增ID;3)通过分区策略(副ID/10)避免大Key问题
2025-06-21 17:06:40
1337
原创 双ID链法实现MQ消费者幂等
双ID链法是一种结合两种互补ID生成方案的技术,通过主ID(如雪花算法)保证全局唯一性,副ID(如Redis自增序列)确保局部连续性。这种组合方案有效解决了单一ID生成器的缺陷,包括时钟回拨、主从切换导致的重复ID等问题,同时优化了大Key存储双ID结构示例为"1256892300152455168_42",其中前半部分为雪花ID,后半部分为自增序列。该方案与MQ幂等机制协同使用,在分布式系统中实现更可靠的消息标识和去重功能
2025-06-21 14:12:09
755
原创 项目拓展-通过Validated实现自定义注解
本文介绍了SpringBoot3中自定义校验注解的实现方法。通过创建自定义注解@State,结合四个元注解(@Documented、@Target、@Retention、@Constraint)定义注解行为。重点讲解了校验规则类StateValidation的实现,需要继承ConstraintValidator接口并重写isValid方法。文章还详细说明了分组校验的实现原理,通过groups参数区分不同业务场景(如新增和更新操作)的校验规则,并演示了在Controller中使用@Validated指定
2025-06-16 19:09:01
573
原创 什么是测试覆盖率
测试覆盖率是现代软件开发中衡量测试充分性的重要指标,主要包括需求覆盖率和代码覆盖率。随着敏捷开发模式的普及,传统的需求覆盖率统计方法已逐渐被代码覆盖率取代。代码覆盖率通过统计被执行代码的百分比(如行覆盖、分支覆盖、条件覆盖等)来评估测试完整性,但高覆盖率并不等同于高质量,因其无法检测代码逻辑外的缺陷。主流的JaCoCo等工具采用字节码注入技术实现覆盖率统计,分为实时(On-The-Fly)和离线(Offline)两种模式
2025-06-16 11:58:18
953
原创 单机定时任务@Schedule的常见问题
@Scheduled注解用于创建定时任务,支持fixedRate(固定速率)、fixedDelay(固定延迟)和cron表达式等配置。默认单线程执行,可通过@Async或自定义线程池实现并发。分布式环境下需使用锁机制避免重复执行。@Async方法默认使用核心线程数为8的线程池,当长时间任务占用所有核心线程时,新任务会进入无界队列导致执行延迟。建议根据业务需求自定义线程池配置,避免使用默认设置带来的性能问题
2025-06-14 18:10:56
945
原创 项目拓展-Apache对象池,对象池思想结合ThreadLocal复用日志对象
本文介绍了一个基于对象池优化的高性能日志上下文管理系统。系统核心RtaProxyContext类采用ThreadLocal隔离和链式调用设计,完整记录请求全链路信息(包括TraceID、请求/响应数据、耗时等)。通过GenericObjectPool实现对象池化(预设200-1000个对象),配合定时监控任务动态调整池容量。拦截器自动管理对象生命周期,复用率提升75%,请求处理时间缩短30%。系统采用滑动窗口算法自适应调整池参数,当5分钟平均活跃数超过当前最大空闲数时自动扩容,最高支持3000并发。
2025-06-14 18:03:12
599
原创 钉钉机器人-自定义卡片推送快速入门
本文详细介绍了通过Java实现钉钉机器人推送卡片消息的技术方案。主要包含三个核心环节:1) 通过appKey/appSecret获取钉钉API访问Token;2) 构建卡片消息实体(包含群聊ID、模板ID、业务数据等);3) 通过HTTP请求发送消息。系统采用模块化设计,包含Notifier接口、DingtalkNotifier实现类,以及CardRequest等POJO实体类。关键参数通过枚举类管理,支持模板化消息和动态数据填充两种模式
2025-06-14 17:59:02
1361
原创 项目拓展-在Java项目中调用Python代码,Jpython快速入门
本文介绍了三种在Java中调用Python程序的方法:1. 使用Jython直接解析Python代码,但存在不支持Python3和第三方库的局限性;2. 通过Runtime.exec()执行Python脚本,能调用包含第三方库的Python3程序;3. 使用PyInstaller将Python脚本打包为可执行文件,方便跨平台分发。重点演示了每种方法的实现代码和注意事项,包括参数传递、错误处理以及PyInstaller的打包参数配置,为Java与Python的混合编程提供了实用解决方案
2025-06-14 17:53:06
1005
原创 项目拓展-Jol分析本地对象or缓存的内存占用
使用JOL工具分析Java对象内存占用,测试IpBlacklistVO类及其实例列表。单个IpBlacklistVO实例占用16字节(包含对象头和String字段),而包含3483个元素的列表总占用267472字节。内存分布显示主要开销来自字节数组(111456B)、对象数组(16672B)、String对象(83592B)和IpBlacklistVO实例(55728B)。测试展示了JOL在分析对象内存布局和集合内存占用方面的实用价值。
2025-06-14 17:34:15
387
原创 项目拓展-简单链路追踪,通过MDC简单实现链路追踪
本文介绍了使用Spring AOP和MDC实现分布式追踪ID的方案。主要包含:1) 依赖配置(Spring AOP、Hutool工具包、日志组件);2) 日志格式配置,支持追踪ID输出;3) AOP切面实现,在Controller层生成唯一traceId并存入MDC;4) 拦截器实现跨服务traceId传递,通过请求头携带追踪ID。方案通过MDC上下文共享机制,确保同一请求链路的日志都能关联相同的traceId,方便问题排查
2025-06-14 17:24:44
195
原创 项目拓展-简易SQL监控,P6SPY拦截所有jdbc连接并打印执行SQL
本文介绍了P6Spy数据库监控工具的Spring Boot集成配置。通过添加p6spy-spring-boot-starter依赖,在application.yml中配置数据源driver-class-name为P6SpyDriver,并设置Hikari连接池参数。重点展示了spy.properties的详细配置,包括SQL日志格式定制、输出设置和性能监控选项。示例日志显示格式化输出的SQL执行详情,包含时间戳、耗时、连接ID和完整SQL语句
2025-06-14 17:22:18
359
原创 Springboot实现Java程序和线程池的优雅关闭
本文介绍了SpringBoot应用的三种优雅关闭方法:1)通过JVM停机钩子注册Thread执行清理操作;2)使用@PreDestroy注解在Bean销毁前释放资源;3)监听ContextClosedEvent事件处理关闭逻辑。重点演示了线程池的优雅关闭实现,对比发现JVM钩子方法可能因中断导致关闭不彻底,而@PreDestroy方式更可靠。配置示例展示了如何在Tomcat中启用graceful模式,确保停机时处理完存量请求
2025-06-12 19:01:17
1268
原创 Java设计模式基础问答
工厂模式通过封装对象创建逻辑到工厂类,提高代码可维护性和扩展性,适用于复杂对象创建场景;策略模式利用统一接口定义行为,子类实现具体策略,优化if-else结构;责任链模式将请求沿处理链传递,实现解耦和动态调整;单例模式确保全局唯一实例,管理共享资源。Spring框架广泛应用这些模式,如DataSource工厂、事务管理策略、过滤器责任链和单例Bean。各模式需权衡优缺点,根据业务复杂度选择使用
2025-06-10 13:53:45
682
原创 HikariCP数据库连接池原理解析
HikariCP作为SpringBoot 2.0默认数据库连接池,通过多维度优化实现高性能:1)字节码精简,使用Javassist生成高效动态代理;2)自定义FastList替代ArrayList,去除越界检查并优化逆序删除;3)独创ConcurrentBag容器,采用ThreadLocal+CAS的无锁设计,结合queue-stealing机制减少竞争。这些设计使其在连接管理(borrow/requite)和资源分配上显著优于传统方案,同时保证可靠性和低内存开销,成为高性能连接池的典范
2025-06-05 21:47:37
608
原创 Hot100之技巧
本文解析了多个算法题目的解题思路和代码实现。首先,通过异或操作的性质,解决了“136只出现一次的数字”问题,利用异或操作找出唯一不重复的数字。接着,通过排序和取中间值的方法,解决了“169多数元素”问题,找到数组中出现次数超过一半的元素。对于“75颜色分类”问题,使用双指针技术将数组中的0、1、2分类排序。在“31下一个排列”问题中,通过找到并交换特定位置的元素,然后反转部分数组,得到下一个更大的排列。最后,通过环形链表的思路,解决了“287寻找重复数”问题,找到数组中唯一的重复数字
2025-05-13 16:43:33
884
空空如也
想学springboost和spring有啥区别吗?
2023-08-04
TA创建的收藏夹 TA关注的收藏夹
TA关注的人