- 博客(505)
- 收藏
- 关注
原创 CompletableFuture浅谈
supplyAsync(Supplier):创建带返回值的异步任务,默认使用ForkJoinPool线程池。runAsync(Runnable):创建无返回值的异步任务,常用于执行副作用操作。两种方法均可通过传入Executor参数指定自定义线程池。。
2025-06-11 16:34:08
228
原创 Skywalking如何生成TraceId
DistributedTraceId有两个实现PropagatedTraceId和NewDistributedTraceIdNewDistributedTraceId会通过GlobalIdGenerator的generate()方法生成traceId并赋值。
2025-06-11 09:44:54
93
原创 Redlock浅谈
假设以下场景:客户端 A 在 Redis 主节点成功获取锁。主节点宕机,锁尚未同步到从节点。从节点晋升为新主节点,此时客户端 B 也能获取同一把锁。结果:客户端 A 和 B 同时持有锁,违反互斥性。
2025-06-10 13:11:50
351
原创 Prometheus高可用集群方案
在多集群,大集群等场景下,Prometheus 由于没有分片能力和多集群支持,还有Prometheus 不支持长期存储、不能自动水平扩缩容、大范围监控指标查询会导致 Prometheus 服务内存突增等。单台的 Prometheus 存在单点故障的风险,随着监控规模的扩大,Prometheus 产生的数据量也会非常大,性能和存储都会面临问题。毋庸置疑,我们需要一套高可用的 Prometheus 集群。
2025-06-10 12:08:40
440
原创 什么是零拷贝?
零拷贝技术对比分析:从传统拷贝到高效传输优化 本文系统介绍了零拷贝技术及其应用场景,对比了多种数据传输方案的性能差异。在文件读取和网络发送场景中,传统方式需要4次CPU拷贝和状态切换,而DMA可减少到2次拷贝但仍有4次切换。进一步优化方案包括:mmap+write(1次CPU拷贝)、sendfile(1次CPU拷贝+2次切换),以及更先进的sendfile+DMA收集和splice方案,实现了零CPU拷贝和仅2次状态切换。这些技术通过减少数据复制次数和上下文切换,显著提升了数据传输效率。
2025-06-05 18:50:50
189
原创 JVM垃圾回收器-ZGC
ZGC是一种高效低延迟垃圾回收器,通过创新技术将STW时间控制在1毫秒内,支持16TB堆内存。相比G1垃圾回收器(存在转移阶段STW时间较长的问题),ZGC采用读屏障和着色指针技术实现并发转移。着色指针将地址分为44位地址、4位状态标志和16位保留空间,通过颜色位标记对象状态。ZGC还采用精细的内存划分策略,将堆分为2MB小区域、32MB中区域和动态分配的大区域,分别存放不同大小的对象。这些设计使ZGC成为高性能应用的理想选择。
2025-06-05 18:33:03
1004
原创 SkyWalking如何实现跨线程Trace传递
SkyWalking 的中构建 Trace 信息时会借助 ThreadLocal来存储一些上下文信息,当遇到跨线程的时候,如果 Trace 的上下文信息没有传递到新线程的ThreadLocal 中,那么链路就断开了。那么SkyWalking是如何解决这个问题的呢?
2025-05-30 12:33:57
302
原创 两个线程交替打印1-100
摘要:本文提供了两种Java多线程交替打印奇偶数的解决方案:1) 使用ReentrantLock配合Condition条件变量实现线程间精确通知;2) 采用synchronized同步块结合wait/notify机制实现。两种方案都通过互斥锁保证线程安全,并使用等待/通知机制实现奇偶线程的有序交替执行,核心区别在于锁的实现方式不同。代码示例展示了完整的实现逻辑,包括线程创建、锁获取与释放以及条件判断处理。
2025-05-27 12:05:06
184
原创 如何设计秒杀系统的库存系统
本文探讨了电商库存系统的设计与优化。核心方案包括:1)通过带条件的UPDATE语句防止超卖;2)权衡Redis与数据库的库存存储方案;3)采用分库分表和请求合并来提升并发处理能力。文章详细讨论了异步处理中的异常场景(如超时回滚、批量扣减失败等),并提出了数据库事务优化、基于binlog的缓存一致性方案(含版本控制机制)。最后指出内存队列的扩展局限性,建议数据库层实现全局排队机制。整套方案兼顾了数据一致性与系统性能。
2025-05-27 08:53:11
420
原创 Redis分布式锁浅谈
Redis分布式锁通过SET命令的NX和PX选项实现原子性加锁,并配合Lua脚本安全释放。核心步骤包括获取锁(SET key unique_value NX PX)、执行业务逻辑和释放锁(验证唯一标识)。需注意锁超时与业务冲突、非原子性风险等问题,可通过合理超时设置、Redisson框架或Redlock算法优化。相比Zookeeper,Redis性能更高但需处理网络分区风险。
2025-05-25 13:48:01
227
原创 Java多线程之线程控制
如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread的sleep方法注意如下几点问题①、sleep是静态方法,最好不要用Thread的实例对象调用它,因为它睡眠的始终是当前正在运行的线程,而不是调用它的线程对象,它只对正在运行状态的线程对象有效。
2025-04-28 15:28:56
907
原创 Error和Exception的区别
运行时异常(RuntimeException)比如,程序中除数为0引起的错误、数组下标越界错误等,这类异常也称为运行时异常,因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。受检查的异常。
2025-04-28 14:50:22
197
原创 找出一堆数中最小的前K个数
于是想到了,用堆来实现,但是自己实现又太麻烦,想到了Java里面的TreeSet,先将K个数放入TreeSet中,由于TreeSet会对里面的元素进行排序,所以在TreeSet中的元素是有序的,以后每插入一个元素,将TreeSet中的最大元素删除即可,所以TreeSet动态维持K个元素且这K个元素是有序的。但是,本题要求的只是求出最小的k个数即可,用排序可以但显然有点浪费,比如让求10000个整数数组中的最小的10个数,用排序的话平均时间复杂度差为Nlog(N)。
2025-04-28 14:40:15
169
原创 Spring-Framework源码环境搭建
distributionUrl=file:/Users/文件路径/gradle-5.6.4-bin.zip。// 自己下载gradle-5.6.4-bin.zip压缩包,改为读取本地文件。// 更换repositories地址。
2025-04-25 14:38:00
430
原创 idea Git操作
1、代码拉取(左上角)2、代码push(左上角)3、切换分支(右下角)4、分支管理5、当前分支和某一个分支对比差异6、当前分支某一个提交需要恢复成提交前状态(revert)7、其他分支的某个提交需要搞到我当前的分支上(cherry-pick)
2024-07-03 16:04:09
425
原创 Java语法糖写法
2、遍历list,获取每一个对象的name属性,转化为list返回。1、如果model不为空,获取他的data属性,否则返回null。
2024-06-19 15:57:43
677
原创 并发JUC经典提问
CAS : 比较当前工作内存中的值和主内存中的值,如果这个值是期望的,那么则执行操作!如果不是就一直循环!缺点:1、 循环会耗时2、一次性只能保证一个共享变量的原子性3、ABA问题捣乱的线程把2020改成2021又改成2020,期望的线程并不知道中间变过。
2024-04-24 11:14:17
311
原创 Redis数据库的数据倾斜
对于集群系统,一般缓存是分布式的,即不同节点负责一定范围的缓存数据。我们把缓存数据分散度不够,导致大量的缓存数据集中到了一台或者几台服务节点上,称为数据倾斜。一般来说数据倾斜是由于负载均衡实施的效果不好引起的。
2024-04-18 19:36:34
1659
原创 230. 二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。示例 1:输入:root = [3,1,4,null,2], k = 1输出:1。
2024-04-15 11:34:50
372
原创 98. 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:root = [2,1,3]输出:true。
2024-04-15 11:25:05
322
1
原创 108. 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵平衡二叉搜索树。示例 1:输入:nums = [-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]
2024-04-15 10:32:37
286
原创 102. 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。示例 1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]
2024-04-15 10:21:12
690
1
原创 543. 二叉树的直径
给你一棵二叉树的根节点,返回该树的 直径。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度。这条路径可能经过也可能不经过根节点 root。两节点之间路径的 长度 由它们之间边数表示。示例 1:输入:root = [1,2,3,4,5]输出:3解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
2024-04-15 10:07:33
444
原创 101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。示例 1:输入:root = [1,2,2,3,4,4,3]输出:true。
2024-04-10 12:11:42
477
原创 226. 翻转二叉树
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]
2024-04-10 11:36:24
368
原创 104. 二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。示例 1:输入:root = [3,9,20,null,null,15,7]输出:3。
2024-04-10 11:24:55
310
原创 94. 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历。示例 1:输入:root = [1,null,2,3]输出:[1,3,2]
2024-04-10 11:16:47
347
原创 148. 排序链表
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表。示例 1:输入:head = [4,2,1,3]输出:[1,2,3,4]
2024-04-09 18:02:23
293
原创 25. K 个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。示例 1:输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]
2024-04-09 12:28:32
312
原创 19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]
2024-04-09 10:53:57
301
原创 2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.
2024-04-09 10:32:19
250
原创 21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]
2024-04-09 10:02:06
315
原创 142. 环形链表 II
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。示例 1:输入:head = [3,2,0,-4], pos = 1。
2024-04-08 11:35:26
755
原创 141. 环形链表
给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回 true。否则,返回 false。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。
2024-04-08 11:21:32
280
原创 234. 回文链表
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true;否则,返回 false。示例 1:输入:head = [1,2,2,1]输出:true。
2024-04-08 11:11:50
435
原创 206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]
2024-04-08 10:24:37
334
原创 240. 搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例 1:输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5输出:true。
2024-04-08 09:53:14
556
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人