自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 从懵逼到上头:和MVCC死磕的108分钟顿悟时刻

MVCC,即多版本并发控制,是一种乐观并发控制技术。数据库为每一行记录保存多个版本。这些版本不仅包含数据的最新状态,还保留了历史状态,从而使得并发事务在读取数据时可以看到一个“快照”。每条记录通过内置的系统列保存版本信息,如事务 ID(通常称为 DB_TRX_ID)、回滚指针(ROLLBACK POINTER)以及删除标记等。这些信息构成了记录的版本链,帮助判断哪个版本对当前事务可见。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!

2025-04-14 17:34:10 643

原创 从阻塞到 Reactor:理解 Java I/O 背后的架构思维

在Java的发展历程中,I/O 模型不断演进以满足高并发和高性能的需求。最初的同步阻塞 I/O 设计简单,但在高并发场景下性能瓶颈明显。为了解决该问题,Java 引入了非阻塞 I/O 模型,而后通过 I/O 多路复用技术(NIO)可以让单个线程同时处理多个 I/O 事件。最后,通过将 I/O 事件的侦测和业务处理分离(例如单线程多路复用负责监听事件,多线程负责业务处理),极大地提升了系统的伸缩性和响应速度。下面我们来详细说明这几个阶段的工作原理和实现方法。异步 I/O 模型。

2025-04-11 10:59:42 991

原创 别再背线程池的七大参数了,现在面试官都这么问

Worker如何通过AQS实现不可重入锁状态机转换如何影响任务调度阻塞队列与线程存活的精妙配合七大参数对你来说不再是孤立的概念,而是有机组合的设计元素。这才是面试官真正想考察的——对并发编程本质的理解能力。下次面试时,不妨主动反问:“您是想了解参数设计的trade-off,还是具体的实现机制?” 这会让面试官眼前一亮。如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!

2025-04-10 14:42:49 1000

原创 Spring状态机实战入门:Java程序的状态流转可以这样管

/ 订单状态枚举 /*** 订单状态枚举(有限状态集合)* 建议:状态命名要直观体现业务含义UNPAID, // 待支付(初始状态) PAID, // 已支付(支付成功后进入此状态) DELIVERING, // 发货中(商家操作发货后状态) COMPLETED // 已完成(用户确认收货后终止状态) } /*** 订单事件枚举(触发状态变化的操作)* 注意:事件命名建议使用动词形态。

2025-04-09 17:36:18 442

原创 三分钟知识点:Spring事务的传播机制

如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!

2025-04-08 13:19:16 970

原创 受够了重复性工作,一怒之下手撸一个多平台文章同步工具

作为喜欢分享技术博客的程序员,我经常需要在**知乎、优快云、今日头条、掘金**四个平台同步内容。于是开发了一个一键同步文章到多平台的工具

2025-04-02 17:45:19 524

原创 当你的对象结构拒绝修改时,访问者模式是如何破局的?

如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!

2025-04-02 11:42:56 894

原创 当甲方说“我全都要“:适配器模式的兼容魔法

如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯,每天推送干货知识!

2025-04-01 18:26:59 710

原创 外观模式(Facade Pattern):复杂系统的“统一入口”

外观模式的深入解析

2025-03-29 23:28:04 631

原创 观察者模式:解耦对象间的依赖关系

观察者模式

2025-03-29 23:23:41 1124

原创 IM入门之:万人群聊系统设计的难点与架构优化实践

空间换时间通过内存缓冲、合并操作化解写入风暴异步化与批处理将同步操作转化为异步队列处理,提升系统吞吐数据分片与本地化避免全局状态依赖,利用哈希分片实现水平扩展柔性设计允许短暂延迟/数据不一致,换取系统整体可用性这些方案已在微博等亿级用户平台验证,可扩展至社交、IoT等需要海量消息分发的场景。在面对类似挑战时,开发者应重点关注写入放大与状态同步问题,通过分层治理实现系统弹性的跃升。加瓦点灯, 每天推送干货知识!

2025-03-29 23:21:17 797

原创 让代码自带「防重」Buff: 手写分布式幂等组件

实现,通过注解声明式配置,提供灵活、高性能的接口幂等性保障。支持快速失败与阻塞等待两种模式,集成自定义策略扩展能力,适用于springboot项目分布式场景下的重复请求拦截与处理。开发者无需修改业务代码即可集成,同时支持灵活扩展,适用于电商、金融等高并发场景,有效保障系统数据一致性。通过 Spring Boot starter 自动装配,支持自定义处理器工厂扩展,无缝集成现有系统。:默认基于 Redis 缓存,支持自定义处理器(如数据库持久化)。注解标记需幂等控制的方法,支持参数动态配置。

2025-03-22 23:12:47 650

原创 @ControllerAdvice无法捕获HandlerInterceptor拦截器里抛出的异常解决办法

@RestControllerAdvice 无法捕获WebMvcConfigurer拦截器里抛出的异常,怎么解决

2025-03-18 10:15:33 205

原创 对线面试官:Java中的锁机制

实现:通过CAS操作将Mark Word复制到线程栈中的Lock Record。在多线程并发编程中,锁是协调线程对共享资源访问的核心机制。等),理解这些分类有助于在实际开发中选择最合适的同步机制。Java显式锁的基石,采用CLH队列变体实现同步控制。不同的锁类型在Java并发包中都有典型实现(如。实现:通过操作系统的互斥量(mutex)实现。原理:在Mark Word中记录线程ID。:保证共享变量的修改对其他线程立即可见。:严格顺序用公平锁,高吞吐用非公平锁。的底层实现经历了多次优化,核心机制为。

2025-03-17 17:38:23 528

原创 Guava EventBus:程序员必备的事件驱动框架,你还没用过?

Google Guava EventBus是Guava工具库中的事件驱动组件,采用发布-订阅模式实现组件间解耦通信。它提供轻量级的事件总线机制,允许不同组件通过事件进行交互而无需直接引用彼此。

2025-03-08 19:57:17 1029

原创 培养项目中横向抽象的能力:构建可复用的技术中台思维

当这种思维成为团队的本能时,你会发现:原本错综复杂的业务系统,正在悄然进化为层次清晰的技术中台。在软件开发中,我们常遇到一类特殊需求:它们不直接属于业务逻辑,却像"毛细血管"般渗透到各个模块中,例如。本文将通过实际案例,揭示如何通过泛型、函数式接口和设计模式的组合拳,打造高复用性的技术中台能力。通过这种设计,开发者可以像搭积木一样组合技术能力,让业务代码保持简洁。:需要统计核心方法的执行耗时、入参和结果,但不希望污染业务代码。培养项目中横向抽象的能力:构建可复用的技术中台思维。,而处理它们的核心能力正是。

2025-02-28 15:36:32 239

原创 Java web后端转Java游戏后端

通过以上流程,Java后端开发者可逐步掌握游戏开发特性,重点需要转变的思维模式包括:从请求响应模式到实时状态同步、从CRUD主导到复杂逻辑计算、从分钟级延迟到毫秒级响应的要求。作为Java后端开发者转向游戏后端开发,虽然核心编程能力相通,但游戏开发在架构设计、协议选择、实时性处理等方面有显著差异。使用Netty/Mina框架处理高并发连接(单机支撑5W+连接是基本要求)动态调整同步频率(近距离玩家100ms/次,远距离500ms/次)采用WebSocket/TCP长连接(90%以上MMO游戏选择)

2025-02-26 11:19:31 712

原创 Java Fork/Join框架详解

在Java并发编程中,Fork/Join框架是一个强大的工具,它允许开发者轻松地利用多核处理器的优势来执行并行任务。作为一名资深Java开发工程师,我将在本文中深入探讨Fork/Join框架的概念、原理、使用场景以及具体的使用方法,并通过实例帮助你更好地理解和掌握这一技术。Fork/Join框架通过智能的任务分发和高效的工作窃取机制,成为处理可分解并行任务的利器。采用递归分解策略:将大任务拆分为子任务(Fork),并行执行后合并结果(Join)。每个线程维护双端队列,优先处理自己的任务。

2025-02-24 17:51:08 688

原创 用上了MethodHandle,妈妈再也不用担心我的反射性能不高了!

虽然它的学习曲线较为陡峭,但在需要高性能动态调用的场景(如规则引擎、RPC框架、动态代理等)中,掌握MethodHandle将使你拥有区别于普通开发者的核心竞争力。在Java的演进历程中,MethodHandle的引入(Java 7)彻底改变了我们对方法调用的传统认知。这个被称作"现代化反射"的特性,不仅带来了接近原生代码的执行效率,更为动态语言特性实现打开了新世界的大门。Java MethodHandle:颠覆你对方法调用的认知(附实战代码)二、基础实战:四步创建你的第一个MethodHandle。

2025-02-14 10:04:32 350

原创 高并发场景下,如何用无锁实现高性能LRU缓存?

通过分段锁设计,我们将单一全局锁的竞争问题转化为多个独立锁的局部竞争,从而在高并发场景下显著提升 LRU 缓存的性能。兼顾了线程安全和高效性,非常适用于对缓存响应时间要求较高的业务场景。源码经过测试,拿走即用,你可以根据实际情况调整分段数及容量,进一步优化性能。加瓦点灯,每天推送干货知识!

2025-02-13 11:20:16 1654

原创 @SneakyThrows:是Java异常处理的“魔法外挂“,还是隐藏的“定时炸弹“?

SneakyThrows如同程序界的"悬浮咒"——用得好可让代码优雅飞行,滥用则可能导致系统失控。横空出世,号称能"悄无声息"地抛出异常,它究竟是解放生产力的神器,还是破坏代码规范的"危险品"?当你凝视@SneakyThrows时,@SneakyThrows也在凝视着你。一、@SneakyThrows初体验:如何让异常"隐形"?层层包裹代码导致"金字塔噩梦",要么在方法签名中不断。引言:当Java的异常机制成为"甜蜜的负担"始终问自己:这个异常是否真的应该被"隐藏"?尽量在方法级别使用,避免类级别注解。

2025-02-11 22:44:51 332

原创 一篇文章讲透Raft共识协议

通过本文的类比讲解,相信你已经掌握了Raft的核心思想。下次当你在Kubernetes上部署应用时,不妨想想etcd如何用Raft协议默默守护着集群状态;当你使用Consul做服务发现时,也能脑补出各个节点间精妙的日志同步过程。用“班级选班长”的故事讲透Raft协议(附Java开发者必知的应用案例)1. etcd(Kubernetes的核心存储)2. Consul(服务发现与配置中心)网络恢复后,高任期Leader自动接管。:建议3-5节点集群,过多节点影响性能。一、从班级选班长理解分布式系统的痛点。

2025-02-10 22:32:34 550

原创 大模型崛起的时代,AI越来越智能,程序员的出路在哪里

2024年和2025年是大模型和AI技术快速崛起的两年, 目前大模型已经在改变我们的工作方式,程序员应该如何顺应这一浪潮?:如操作系统、编译器、嵌入式系统等,对性能要求极高,AI 目前难以完全替代人类优化。,不仅写代码,还需要学会如何利用 AI 提高效率,专注于更高层次的创新和决策。:利用 LLM 开发 AI 辅助工具、AI 生成内容(AIGC)、智能客服等。:研究和开发 AI 相关的技术,如大模型微调、AI 训练、AI 伦理问题等。:大模型能生成代码,但构建高效、可扩展的系统架构仍然需要深入的工程经验。

2025-02-10 14:46:01 365

原创 Protobuf为何成为高效数据交换的首选?

/ 单位:分// 支持价格调整负值。

2025-02-09 22:39:43 1023

原创 索引失效的14种常见场景

在 MySQL 中,索引有时可能会失效,导致查询性能下降。: 尽量避免在查询条件中使用这些情况,或者使用合适的索引(如组合索引、覆盖索引)来优化查询。: 使用联合索引时,如果查询的列顺序与索引创建时的顺序不匹配,索引可能会失效。: 如果查询中使用的列的数据类型与索引列的数据类型不匹配,可能导致索引失效。子句时,如果没有明确的排序索引,MySQL 可能无法使用索引。连接的多个条件中有一个没有使用索引,可能会导致索引失效。: 如果查询中在索引列上应用了函数,索引可能失效。子句)没有涉及索引时,索引会失效。

2025-02-08 18:44:08 1007

原创 今日思考:程序是如何实现随机的?以及什么是真随机和伪随机

今日神游,忽然沉思:随机是指现实生活中无规律,不可预测的事情,例如:抛硬币。的,看似随机但可预测的数列。这类随机数由数学公式计算得出,如果使用相同的初始种子(seed),则会生成相同的随机数序列。模块使用 MT19937,周期长((2^{19937}-1)),适用于科学计算和游戏随机数。如果软件代码依赖了硬件(例如:硬件噪声)那么就可以实现真随机。(a)(乘数)、(c)(增量)、(m)(模数)是预定义的常数。:相同的种子(seed)会生成相同的随机数序列。:伪随机数使用数学公式生成,比真随机数快。

2025-02-08 10:46:37 1130

原创 mysql的cpu使用率100%问题排查

欢迎点击关注gzh:

2025-02-07 17:07:36 950

原创 高性能队列 Disruptor 在 IM 系统中的实战

在 IM 系统中,用户 A 发送消息给 B、C、D 时,需要根据 B、C、D 所在的服务器节点进行分组,并将消息转发到对应的节点上。通过 Disruptor,可以大幅降低锁竞争,提高 IM 系统的吞吐量,使其能够在高并发环境下稳定运行。还没有对应的 RingBuffer 时,我们需要创建一个新的 Disruptor,并将其存入。在IM系统用的应用实战,IM系统即社交聊天系统,对实时性的要求非常高,非常符合。根据用户所在的服务节点,进行消息转发(发送消息事件到Disruptor)

2025-01-23 23:41:31 435

原创 手把手教会你Disruptor的常用使用场景!(含详细代码示例)

上期介绍到Disruptor 是一个高性能的无锁并发队列,适用于需要极低延迟和高吞吐量的应用场景。今天介绍 Disruptor 的几个常见使用场景:事件处理、日志记录、消息传递、实时数据分析和并发任务调度,让你进一步加深对它的印象,下期将介绍Disruptor核心原理。Disruptor 在低延迟、高吞吐场景下表现优异,适用于事件处理、日志记录、消息传递、实时数据分析和并发任务调度等应用。Disruptor 适用于高吞吐量的消息传递系统,例如消息队列,以及实时消息等。的核心原理, 欢迎点击关注。

2025-01-22 16:24:47 223

原创 高性能队列Disruptor的初体验

Disruptor 是一个高性能、低延迟的无锁队列替代方案,最初由 LMAX 公司开发,专为处理高吞吐量和低延迟的消息传递系统而设计。它利用环形缓冲区(RingBuffer)和无锁的生产者-消费者模型,大幅提升并发性能。今天先初步了解Disruptor的简单用法,后续会继续介绍Disruptor的特性,为什么性能秒杀JDK提供的队列,以及相关原理分析。:用于协调生产者和消费者的进度,确保消费者不会读取尚未发布的数据。,用于跟踪当前生产和消费的位置。:一个消费者的输出作为另一个消费者的输入。

2025-01-21 18:14:19 864

原创 轻量级限流算法的实现,拿走即用!

这段限流算法实现的比较简易,仅适合单体服务,如果是分布式系统可以使用redis来实现。最后, 欢迎收看往期干货加瓦点灯。

2025-01-20 17:11:34 783

原创 应用“懒加载“模式,优化@Transactional事务性能(LazyConnectionDataSourceProxy 原理解析)

LazyConnectionDataSourceProxy原理解析

2025-01-19 17:40:43 670

原创 保姆级解析雪花算法原理,看完必懂!

算法结合了时间戳、机器节点ID和序列号,保证了生成的ID在分布式环境下的唯一性,并且能够高效地生成ID(,但是它在实现上做了若干调整,主要体现在时间的基准点、节点ID的位宽、序列号的位宽等方面。:为了确保在高并发环境下生成的ID是唯一的,并且避免多个线程同时生成ID时产生冲突,使用了自旋锁。节点ID的设计保证了在多节点环境下生成的ID不会冲突,每个节点生成的ID是唯一的。:此时没有更多的ID可以生成,因此需要等待直到系统时间继续前进,产生下一个毫秒的时间戳。

2025-01-18 22:43:30 581

原创 使用 Java 实现基于 DFA 算法的敏感词检测

DFA(确定有限状态自动机)是一种用于字符串匹配的高效算法。它的核心思想是将多个敏感词组织成一棵状态机,在匹配过程中避免重复扫描,提升检测速度。构建状态机(即DFA树):将敏感词列表逐字构建成一个树形结构,每个字符对应一个节点,单词的结束位置标记为终止状态。文本匹配:使用状态机遍历输入文本,遇到匹配字符时进入下一个状态,直到匹配完整的敏感词。DFA 的优点在于匹配时的时间复杂度是 O(n),即文本长度的线性时间,适用于高性能需求的敏感词检测。

2025-01-17 11:04:29 432

原创 reduce 到底是什么?Java8 Stream 的终极聚合工具详解

是 Java Stream API 提供的一个终端操作方法,用于将流中的元素组合起来生成一个单一的值。这一方法非常强大,可以实现累积、聚合、拼接等功能,适用于各种数据处理场景。,我们可以优雅地处理复杂的数据聚合需求,使代码更加简洁高效。仅在并行流中使用,定义了如何将多个部分结果合并成一个结果。一个函数,定义了如何将流中的元素与当前累积值结合。,逐个处理流中的每个元素,将其累积为一个值。非常重要,它用于合并多个线程的部分结果。将流中的字符串拼接为一个完整的字符串。是一个通用的归约操作,它通过一个。

2025-01-16 10:54:12 342

原创 深挖 Java8的Stream.flatMap:你不知道的流式操作技巧

是 Java8 Stream API 的核心方法之一,主要用于将嵌套结构展开并生成一个新的流。它的强大之处在于能够处理复杂数据结构并将其转换为简单的线性流。的核心功能是将多个流或嵌套结构展开为一个流,这使得它在处理复杂数据结构、多对多关系以及动态数据合并时非常有用。将字符串列表中的每个字符串拆分为单词,然后合并为单一流。,可以极大地简化代码逻辑,提高数据处理效率和代码可读性。通过映射关系生成多个结果,并将其合并为单一流。从多个文件读取所有行并合并为一个流。的流展开为非空值的单一流。,将其扁平化为单一流。

2025-01-15 17:29:44 344

原创 使用try-with-resource实现自动解锁

接口,我们可以轻松实现锁的自动释放,这样的做法不仅能提高代码的简洁性和可维护性,还能避免因忘记释放锁而导致的死锁或资源泄漏问题。这种模式在多线程编程中非常有用,尤其是在处理共享资源时,能够有效保证资源的安全和并发控制的准确性。: 通过封装锁的获取与释放,我们提高了代码的可维护性,使得并发控制的逻辑更加清晰。方法中,我们可以添加额外的异常处理逻辑,确保在锁释放过程中没有异常被忽略。语句块,而是由 Java 的资源管理机制自动处理,从而减少了死锁的风险。会自动管理资源的关闭,它要求使用的资源必须实现。

2025-01-14 17:16:44 267

原创 使用WeakHashMap实现缓存自动清理

通过本文的示例,你可以了解到如何使用 WeakHashMap 来实现一个缓存系统,并让它自动管理内存,避免手动清理缓存项。触发缓存清理:当查询条件对象 query1 被置为 null 后,WeakHashMap 中的缓存项会被自动清除,因为该键对象没有强引用指向它。我们希望缓存查询结果,当查询的条件对象不再被使用时,它的缓存结果能够自动清理。缓存系统:当我们需要缓存一些不常用的数据时,WeakHashMap 可以自动清理不再使用的缓存项,减少内存占用。第二次查询时,缓存命中,直接返回缓存结果。

2025-01-13 17:30:07 1175

原创 使用 CompletableFuture 实现异步编程

是 Java 异步编程的强大工具,提供了丰富的 API 来实现任务的创建、组合和异常处理。通过熟练掌握,可以编写更加简洁高效的异步代码。希望本文能帮助你更好地理解和使用!

2025-01-12 23:26:07 457

原创 【用 StampedLock 实现高效读写锁】

用 StampedLock 实现高效读写锁

2025-01-10 10:38:06 295

空空如也

空空如也

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

TA关注的人

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