自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(213)
  • 资源 (1)
  • 收藏
  • 关注

原创 K8S Nginx Ingress Controller client_max_body_size 上传文件大小限制

k8s集群中,上传图片时,大于1M就会报错 413 Request Entity Too Large。Nginx Ingress Controller 的版本是 0.29.0。查看nginx配置中client_max_body_size的值。

2024-01-09 14:15:59 1650 1

原创 【Java Stream Trick】根据多个参数过滤,过滤之前需要校验参数是否存在

有一个对象列表,需要根据多个参数进行 filter。但是参数不一定存在,若不存在则跳过,否则过滤。核心是在 filter 时先判断 paramter 是否存在。

2023-03-16 18:30:17 476 1

原创 【Java 面试题合集】ThreadPoolExecutor 线程池面试题

maximumPoolSize 最大线程数keepAliveTime 存活时间unit 时间单位workQueue 存放待执行任务的队列threadFactory 创建线程的工厂。创建线程或线程池时指定有意义的线程名称,方便出错时回溯。handler 拒绝策略项目中,我们会使用简单的线程隔离的方案,每个业务使用一个线程池。

2023-01-31 11:12:00 616

原创 【正本清源】Synchronized 源码全解之偏向锁的获取(基于 Openjdk12)

基于openjdk12的Synchronized锁升级过程之偏向锁的获取。

2023-01-29 15:20:20 568

原创 JDK8 源码角度分析 WeakHashMap 与 WeakReference 和 ReferenceQueue 三者关联

WeakHashMap 与 WeakReference 和 ReferenceQueue 三者关联关系。

2022-12-13 00:18:53 379

原创 JDK8 ThreadLocal 源码解析与最佳实践

ThreadLocal 中为什么要使用弱引用?ThreadLocal 什么情况下会内存泄漏?ThreadLocal 在 Spring 源码中的实践。

2022-12-11 19:24:34 552

原创 【开发踩坑】EXT-X-DISCONTINUITY 合并多个 m3u8 文件到一个 m3u8

因业务需求,需要将多个 m3u8 文件合并成一个。解析 m3u8 文件以后,发现一个文件分为 3 部分,第一部分是 #EXTM3U 这些文件头,第二部分是 ts 后缀的视频分片文件,第三部分就是 #EXT-X-ENDLIST 结尾。所以我的思路就是将多个 m3u8 文件的 ts 都提取出来合并到一起,然后加上头和结尾。合并出来的文件能正常播放,但是每次第一个视频文件播放完以后就不自动播放第二个视频了。原因是拼接的 2 个 ts 文件的时间不连续了,所以不会自动续播。

2022-11-25 09:50:43 4026

原创 【JUC源码专题】Striped64 核心源码分析(JDK8)

一言以蔽之:合理分散线程竞争。将对 base 的 cas 分散到 base 和 cells 数组中。Striped64 的核心是通过分治思想将对 base 的竞争分散到不同的 cell 单元中。使用 @Contended 注解来支持缓存行填充,避免 value 的缓存行伪共享。

2022-11-23 20:12:38 460

原创 【JUC源码专题】ReentrantReadWriteLock 核心源码分析(JDK8)

Sync 类继承了 AQS,这也是个[[模版方法模式]],实现了公平锁和非公平锁公共的方法,同时定义了一些抽象方法,让 FairSync 和 NonfairSync 子类分别去实现,比如。acquire 方法依赖于 tryAcquire 方法的返回值,tryAcquire 方法的具体逻辑由 AQS 子类实现。ReadLock 的 lock 方法调用了 AQS 的 acquireShared 方法。WriteLock 的 lock 方法调用了 AQS 的 acquire 方法。,低 16 位用于表示。

2022-11-20 17:59:39 333

原创 【JUC源码专题】AQS 核心源码分析(JDK8)

AQS 源码分析

2022-11-19 21:41:19 843

原创 通过汇编理解 C 语言指针原理

指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:通过汇编理解指针编译 demo.c查看 demo.s(为了便于理解未开启优化且删除了部分和本文要讨论的内容无关代码)根据上述汇编代码,我们总结以下什么是指针:下面我们再看一个例子加深理解指针的算数运算C 语言中,对指针执行 +1 运算,编译器会参照指针类型的大小,执行+1。如果是 int 类型的指针,对其 +1,编译器就会自动加上

2022-10-19 10:21:47 1253

原创 【JUC源码专题】LinkedBlockingDeque 源码分析(JDK8)

LinkedBlockingDeque 是基于链表实现的双端阻塞队列,我们可以从队列的头部和尾部插入或者读取元素。

2022-09-21 18:49:56 422

原创 【JUC源码专题】LinkedBlockingQueue 源码分析(JDK8)

LinkedBlockingQueue 不同于 ArrayBlockingQueue,前者通过使用 Atomicinteger 类型的 count 变量和链表中哨兵结点(头结点 head)将锁拆分为 take 和 put 两把锁使锁细粒度化了,在多线程竞争方面性能优于后者。后者由于是连续的地址空间,所以适合用在需要利用高速缓存的场景。

2022-09-21 11:07:40 430

原创 【JUC源码专题】ArrayBlockingQueue 源码分析(JDK8)

ArrayBlockingQueue 通过一个全局锁和两个条件变量实现了一个标准的生产者消费者模型。

2022-09-20 11:33:44 149

原创 JDK8 ThreadPoolExecutor 线程池源码深度解析(附几种线程池的扩展方式)

实现 RejectedExecutionHandler 重写 rejectedExecution 方法。//自定义处理方式,可以先打个日志 xxx 被我拒绝了 然后我把它放到了 redis 里 ... //log("r rejected") //save r in kafka、mysql、redis } }// 自定义的线程池类,继承自ThreadPoolExecutor private EagerThreadPoolExecutor executor;

2022-09-06 20:20:50 482

原创 ConcurrentHashMap 中竟有好几个BUG?JDK8 源码深度解析

上述 sc < 0 的判断条件永远不可能进入,因为 sc 是 while 循环中的局部变量。因为 sc 的高 16 代表 rs,如果 sc 和 rs

2022-09-04 16:13:31 1004 2

原创 【JUC源码专题】ReentrantLock 核心源码分析(JDK8)

判断当前是否有线程持有锁若有,判断是否是当前线程,若是当前线程则重入。重入次数超过上限(int 最大值)则抛异常。若不是当前线程持有锁,则将当前线程封装成 Node 进入队列排队。若没有线程持有锁,则判断队列中是否有其他线程正在排队。若没有线程排队或者当前线程排在第一个,则基于CAS的方式将 state 修改为1。若修改成功则表示获取锁成功,将当前线程设置到 exclusiveOwnerThread,代表是当前线程持有锁资源。设置中断标记位selfInterrupt()。

2022-08-29 22:13:47 410

原创 【JAVA基础】JDK8 HashMap 源码深度解析

而且当 key 是 Integer 时且小于等于 65535 时,(h = key.hashCode())^ (h >>> 16) 和 key 的值是相等的,所以此时 key 是有序递增的。当 key 大于 65535 以后,高 16 位就不全是 0 了,(h = key.hashCode())^ (h >>> 16) 的值就与 key 不相等了。n = 16 时,(h ^ (h >>> 16)) & (n-1) = 5, 即计算出来的下标是 5。JDK8:数组 + 链表 + 红黑树。...

2022-08-27 02:02:52 389

原创 【JAVA基础】深入解析 ArrayList 和 LinkedList 的区别?

算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。所以在链表中插入和删除一个数据的时间复杂度是 O(1)。如果我们申请了大小为 10 的数组,当第 11 个数据需要存储到数组中时,我们就需要重新分配一块更大的空间,将原来的数据复制过去,然后再将新数据插入。因为数组使用是一组连续的内存空间,所以它可以借助 CPU 的缓存机制,预读数组中的数据,弥补内存访问速度过慢与CPU执行速度快之间的差异。

2022-08-22 21:54:38 394 1

原创 面试题 17.05. 字母与数字

输入: [“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”,“H”,“I”,“J”,“K”,“L”,“M”]输出: [“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”]链接:https://leetcode.cn/problems/find-longest-subarray-lcci。给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。...

2022-08-07 22:18:44 168

原创 1052. 爱生气的书店老板

给定一个长度为 n 的整数数组 customers ,其中 customers[i] 是在第 i 分钟开始时进入商店的顾客数量,所有这些顾客在第 i 分钟结束后离开。输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], minutes = 3。如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。输入:customers = [1], grumpy = [0], minutes = 1。...

2022-08-07 22:18:01 109

原创 力扣1037. 有效的回旋镖

给定一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点,如果这些点构成一个 回旋镖 则返回 true 。回旋镖 定义为一组三个点,这些点 各不相同 且 不在一条直线上 。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/valid-boomerang...

2022-07-03 22:46:52 123

原创 MySQL中回表的代价

对于下面这个查询语句来说:我们可以选择下面这两种方式来执行。对于使用 InnoDB 存储引擎的表来说,索引中的数据页都必须存放在磁盘中,等到需要时再加载到内存中使用。这些数据页会被存放到磁盘中的一个或者多个文件中,页面的页号对应着该页在磁盘文件中的偏移量。以 16KB 大小的页面为例,页号为 0 的页面对应着这些文件中偏移量为 0 的位置,页号为 1 的页面对立着这些文件中偏移量为 16KB 的位置。B+树的每层节点会使用双向链表连接起来,上一个节点和下一个节点的页号可以不必相邻。不过在实际实现中,I

2022-07-03 22:06:14 392

原创 力扣1217. 玩筹码

有 n 个筹码。第 i 个筹码的位置是 position[i] 。我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i 个筹码的位置从 position[i] 改变为:position[i] + 2 或 position[i] - 2 ,此时 cost = 0position[i] + 1 或 position[i] - 1 ,此时 cost = 1返回将所有筹码移动到同一位置上所需要的 最小代价 。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/

2022-06-16 22:36:21 257

原创 力扣 1984. 学生分数的最小差值

给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。返回可能的 最小差值 。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/minimum-difference-between-highest-and-lowest-of-k-scores...

2022-06-06 21:42:42 215

原创 力扣 1652. 拆炸弹

你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。如果 k > 0 ,将第 i 个数字用 接下来 k 个数字之和替换。如果 k < 0 ,将第 i 个数字用 之前 k 个数字之和替换。如果 k == 0 ,将第 i 个数字用 0 替换。由于 code 是循环的, code[n-1] 下一个元素是 code[0] ,且 code[0] 前一个元素是 code[n-1] 。给你

2022-06-02 00:17:38 152

原创 力扣 1848. 到目标元素的最小距离

给你一个整数数组 nums (下标 从 0 开始 计数)以及两个整数 target 和 start ,请你找出一个下标 i ,满足 nums[i] == target 且 abs(i - start) 最小化 。注意:abs(x) 表示 x 的绝对值。返回 abs(i - start) 。题目数据保证 target 存在于 nums 中。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/minimum-distance-to-the-target-element

2022-06-01 21:39:57 154

原创 力扣 1588. 所有奇数长度子数组的和

给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。子数组 定义为原数组中的一个连续子序列。请你返回 arr 中 所有奇数长度子数组的和 。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/sum-of-all-odd-length-subarrays

2022-06-01 21:13:32 137

原创 力扣 500 键盘行

文章目录题目思路题目给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。美式键盘 中:第一行由字符 “qwertyuiop” 组成。第二行由字符 “asdfghjkl” 组成。第三行由字符 “zxcvbnm” 组成。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/keyboard-row思路将 26 个字母 a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、

2022-05-23 20:38:06 146

原创 MySQL 5.7 undo log 从入门到放弃

文章目录undo 日志的格式INSERT 操作对应的 undo 日志DELETE 操作对应的 undo 日志删除一条记录的 2 个阶段UPDATE 操作对应的 undo 日志不更新主键就地更新(in-place update)先删除旧记录,再插入新纪录更新主键增删改操作对二级索引的影响为事务分配 Undo 页面链表的详细过程undo 日志在崩溃恢复时的作用总结事务需要保证原子性。 但是偏偏有时候事务在执行到一半时会出现一些情况,比如下面这些情况:事务执行过程中可能遇到各种错误,比如服务器本身的错误、

2022-05-22 18:53:39 645

原创 力扣 2016 增量元素之间的最大差值

题目描述给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。返回 最大差值 。如果不存在满足要求的 i 和 j ,返回 -1 。解法一:暴力解法 public static int maximumDifference(int[] nums) { // 不存在同时满足 i < j 和 nu

2022-05-22 11:27:29 158

原创 Kafka 中 topic、partition、offset、replica、ISR 等概念详解

文章目录消息的数据结构topic 和 partition位移(offset)replicaleader 和 followerISR消息的数据结构Kafka 中的消息格式由很多字段组成,其中的很多宇段都是用于管理消息的元数据字段,对用户来说是完全透明的。Kafka 消息格式共经历过 3 次变迁,它们被分别称为 VO、V1 和 V2 版本。V1 版本消息的完整格式如下图所示:消息由消息头部、 key 和 value 组成。消息头部包括消息的 CRC 码、消息版本号、属性、时间戳、键长度和消息体长度等信息

2022-05-03 14:07:20 5526 1

原创 docker 快速启动 Confluent Kafka

通过 docker 快速启动一个 Kafka 用于快速入门 Kafka。本文包括如何使用docker从0搭建Kafka并生产消息和消费消息。

2022-04-27 22:58:23 3202

原创 Kafka rebalance 重平衡深度解析

文章目录rebalance 触发条件分区分配策略rebalance generation消费者状态机rebalance 协议消费者端 rebalance 流程Broker 端重平衡场景解析新成员入组组成员主动离场组成员崩溃离场重平衡时协调者对组内成员提交位移的处理rebalance 监听器consumer group 是用于实现高伸缩性、高容错性的 consumer 机制。组内多个 consumer 实例可以同时读取 Kafka 消息,而且一旦有某个 consumer “挂”了,consumer grou

2022-04-26 00:34:06 1299

原创 Kafka Consumer 位移提交

位移的概念每个 consumer 实例都会为它消费的分区维护属于自己的位置信息来记录当前消费了多少条消息 。在 Kafka 中,这叫位移 Offset。消费位移记录了 Consumer 要消费的下一条消息的位移。consumer group 使用一个长整型保存 offset。同时 Kafka consumer 还引入了检查点机制( checkpointing)定期对 offset 进行持久化,从而简化了应答机制的实现 。 Kafka consumer 在内部使用一个 map 来保存其订阅 topic 所

2022-04-25 20:42:24 1997

原创 长文详解 MySQL redo log 原理

文章目录redo 日志格式简单的 redo 日志类型复杂的 redo 日志格式举个例子redo 日志格式小结Mini-Transcation以组的形式写入 redo 日志Mini-Transaction 的概念redo 日志写入过程redo log blocklog block headerlog block trailerredo 日志缓冲区redo 日志写入 log bufferredo 日志文件刷盘时机redo 日志文件组redo 日志文件格式特殊 blocklog sequence numberfl

2022-04-10 23:09:24 2366 1

原创 MySQL 事务并发执行时的一致性问题

文章目录事务并发执行时遇到的一致性问题脏写(Dirty Write)脏读(Dirty Read)不可重复读(Non-Repeatable Read)幻读(Phantom)MySQL 中的幻读参考资料MySQL 是一个客户端/服务器架构的软件。对于同一个服务器来说,可以有多个客户端与之连接。每个客户端与服务器建立连接后,就形成了一个会话。每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分。服务器可以同时处理来自多个客户端的多个事务。在某个事务访问某个数据时,如要求其他试

2022-04-08 00:31:19 1746

原创 Java ArrayList 和 LinkedList 有什么区别

文章目录异ArrayList 基于数组实现,LinkedList 基于链表实现。同都是线程不安全的异ArrayList 基于数组实现,LinkedList 基于链表实现。链表适合插入、删除,时间复杂度 O(1);数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)。假设数组的长度为 n,现在我们将一个数据插入到数组中的第 k 个位置。为了把第 k 个位置腾出来给新来的数据,我们需要将第 k~n 这部分的元素都顺序地挪动一位。那插入的时间复杂度为多少?假设数组有序如果在数组的末尾插入

2022-03-16 12:55:13 749

原创 如何清晰回答好 TCP 三次握手,四次挥手

文章目录为什么需要第三次握手信息对等防止超时为什么需要四次挥手类比男女分手确认被动关闭方能够顺利进入CLOSE状态防止失效请求TCP协议规定,只有ACK=1时表示对方数据发送有效,规定连接建立后所有发送的报文的ACK必须为1TCP的报文放在IP的报文里,IP的报文放在链路层的报文里。为什么需要第三次握手信息对等确认 Client 和 Server 发送和接受消息的能力。防止超时主要是为了防止两次握手情况下已失效的连接请求报文段(可能是请求连接超时)突然又传送到服务端,而产生

2022-03-14 15:33:30 2674

原创 JVM 内存分代模型

文章目录堆内存逻辑分区新生代老年代堆内存逻辑分区新生代Eden : s0 : s1 = 8 : 1 : 1YGC回收之后,大多数的对象会被回收,活着的进入s0再次YGC(Young GC/Minor GC),活着的对象eden + s0 -> s1再次YGC,eden + s1 -> s0年龄足够 -> 老年代最大是 15(对象头里用4位二进制来表示一个对象的年龄),CMS 是 6s 区装不下 -> 老年代(分配担保)动态年龄判断虚拟机并不是永远地要

2022-03-14 13:53:25 1435

阿里巴巴Java开发手册华山版.zip

阿里java开发手册华山论剑版 1.5 阿里java开发手册华山论剑版 1.5 阿里java开发手册华山论剑版 1.5

2020-03-14

空空如也

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

TA关注的人

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