自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 什么是零拷贝?

零拷贝技术对比分析:从传统拷贝到高效传输优化 本文系统介绍了零拷贝技术及其应用场景,对比了多种数据传输方案的性能差异。在文件读取和网络发送场景中,传统方式需要4次CPU拷贝和状态切换,而DMA可减少到2次拷贝但仍有4次切换。进一步优化方案包括:mmap+write(1次CPU拷贝)、sendfile(1次CPU拷贝+2次切换),以及更先进的sendfile+DMA收集和splice方案,实现了零CPU拷贝和仅2次状态切换。这些技术通过减少数据复制次数和上下文切换,显著提升了数据传输效率。

2025-06-05 18:50:50 181

原创 JVM垃圾回收器-ZGC

ZGC是一种高效低延迟垃圾回收器,通过创新技术将STW时间控制在1毫秒内,支持16TB堆内存。相比G1垃圾回收器(存在转移阶段STW时间较长的问题),ZGC采用读屏障和着色指针技术实现并发转移。着色指针将地址分为44位地址、4位状态标志和16位保留空间,通过颜色位标记对象状态。ZGC还采用精细的内存划分策略,将堆分为2MB小区域、32MB中区域和动态分配的大区域,分别存放不同大小的对象。这些设计使ZGC成为高性能应用的理想选择。

2025-06-05 18:33:03 822

原创 SkyWalking如何实现跨线程Trace传递

SkyWalking 的中构建 Trace 信息时会借助 ThreadLocal来存储一些上下文信息,当遇到跨线程的时候,如果 Trace 的上下文信息没有传递到新线程的ThreadLocal 中,那么链路就断开了。那么SkyWalking是如何解决这个问题的呢?

2025-05-30 12:33:57 290

原创 两个线程交替打印1-100

摘要:本文提供了两种Java多线程交替打印奇偶数的解决方案:1) 使用ReentrantLock配合Condition条件变量实现线程间精确通知;2) 采用synchronized同步块结合wait/notify机制实现。两种方案都通过互斥锁保证线程安全,并使用等待/通知机制实现奇偶线程的有序交替执行,核心区别在于锁的实现方式不同。代码示例展示了完整的实现逻辑,包括线程创建、锁获取与释放以及条件判断处理。

2025-05-27 12:05:06 179

原创 如何设计秒杀系统的库存系统

本文探讨了电商库存系统的设计与优化。核心方案包括:1)通过带条件的UPDATE语句防止超卖;2)权衡Redis与数据库的库存存储方案;3)采用分库分表和请求合并来提升并发处理能力。文章详细讨论了异步处理中的异常场景(如超时回滚、批量扣减失败等),并提出了数据库事务优化、基于binlog的缓存一致性方案(含版本控制机制)。最后指出内存队列的扩展局限性,建议数据库层实现全局排队机制。整套方案兼顾了数据一致性与系统性能。

2025-05-27 08:53:11 381

原创 Redis分布式锁浅谈

Redis分布式锁通过SET命令的NX和PX选项实现原子性加锁,并配合Lua脚本安全释放。核心步骤包括获取锁(SET key unique_value NX PX)、执行业务逻辑和释放锁(验证唯一标识)。需注意锁超时与业务冲突、非原子性风险等问题,可通过合理超时设置、Redisson框架或Redlock算法优化。相比Zookeeper,Redis性能更高但需处理网络分区风险。

2025-05-25 13:48:01 211

原创 Java多线程之线程控制

如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread的sleep方法注意如下几点问题①、sleep是静态方法,最好不要用Thread的实例对象调用它,因为它睡眠的始终是当前正在运行的线程,而不是调用它的线程对象,它只对正在运行状态的线程对象有效。

2025-04-28 15:28:56 905

原创 Error和Exception的区别

运行时异常(RuntimeException)比如,程序中除数为0引起的错误、数组下标越界错误等,这类异常也称为运行时异常,因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。受检查的异常。

2025-04-28 14:50:22 196

原创 找出一堆数中最小的前K个数

于是想到了,用堆来实现,但是自己实现又太麻烦,想到了Java里面的TreeSet,先将K个数放入TreeSet中,由于TreeSet会对里面的元素进行排序,所以在TreeSet中的元素是有序的,以后每插入一个元素,将TreeSet中的最大元素删除即可,所以TreeSet动态维持K个元素且这K个元素是有序的。但是,本题要求的只是求出最小的k个数即可,用排序可以但显然有点浪费,比如让求10000个整数数组中的最小的10个数,用排序的话平均时间复杂度差为Nlog(N)。

2025-04-28 14:40:15 167

原创 Spring-Framework源码环境搭建

distributionUrl=file:/Users/文件路径/gradle-5.6.4-bin.zip。// 自己下载gradle-5.6.4-bin.zip压缩包,改为读取本地文件。// 更换repositories地址。

2025-04-25 14:38:00 423

原创 idea Git操作

1、代码拉取(左上角)2、代码push(左上角)3、切换分支(右下角)4、分支管理5、当前分支和某一个分支对比差异6、当前分支某一个提交需要恢复成提交前状态(revert)7、其他分支的某个提交需要搞到我当前的分支上(cherry-pick)

2024-07-03 16:04:09 423

原创 Java语法糖写法

2、遍历list,获取每一个对象的name属性,转化为list返回。1、如果model不为空,获取他的data属性,否则返回null。

2024-06-19 15:57:43 677

原创 什么是JMM以及 Volatile

Java内存模型,不存在的东西,概念!约定!

2024-04-24 12:15:46 322

原创 函数式接口及Stream流式计算

ForkJoin 特点:工作窃取,这个里面维护的都是双端队列。

2024-04-24 12:02:00 549

原创 并发JUC经典提问

CAS : 比较当前工作内存中的值和主内存中的值,如果这个值是期望的,那么则执行操作!如果不是就一直循环!缺点:1、 循环会耗时2、一次性只能保证一个共享变量的原子性3、ABA问题捣乱的线程把2020改成2021又改成2020,期望的线程并不知道中间变过。

2024-04-24 11:14:17 309

原创 Redis数据库的数据倾斜

对于集群系统,一般缓存是分布式的,即不同节点负责一定范围的缓存数据。我们把缓存数据分散度不够,导致大量的缓存数据集中到了一台或者几台服务节点上,称为数据倾斜。一般来说数据倾斜是由于负载均衡实施的效果不好引起的。

2024-04-18 19:36:34 1653

原创 230. 二叉搜索树中第K小的元素

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。示例 1:输入:root = [3,1,4,null,2], k = 1输出:1。

2024-04-15 11:34:50 371

原创 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 287

原创 102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。示例 1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]

2024-04-15 10:21:12 688 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 476

原创 226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]

2024-04-10 11:36:24 367

原创 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 346

原创 23. 合并 K 个升序链表

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:1->4->5,1->3->4,2->6将它们合并到一个有序链表中得到。

2024-04-09 18:21:08 325

原创 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 311

原创 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 251

原创 21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]

2024-04-09 10:02:06 314

原创 142. 环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。示例 1:输入:head = [3,2,0,-4], pos = 1。

2024-04-08 11:35:26 752

原创 141. 环形链表

给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回 true。否则,返回 false。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。

2024-04-08 11:21:32 278

原创 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

原创 48. 旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]

2024-04-07 18:24:50 428

原创 41. 缺失的第一个正数

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例 1:输入:nums = [1,2,0]输出:3解释:范围 [1,2] 中的数字都在数组中。示例 2:输入:nums = [3,4,-1,1]输出:2解释:1 在数组中,但 2 没有。

2024-04-07 15:52:32 540

原创 238. 除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法,且在 O(n) 时间复杂度内完成此题。示例 1:输入: nums = [1,2,3,4]输出: [24,12,8,6]

2024-04-07 12:08:47 630

原创 189. 轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]

2024-04-07 12:00:43 573

空空如也

空空如也

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

TA关注的人

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