- 博客(50)
- 收藏
- 关注
原创 synchronized和lock的区别
原子性指的是一个操作或一系列操作要么全部执行完成并且不被打断,要么完全不执行。保证了被同步块包围的代码在任意时刻只能被一个线程执行。
2024-08-27 15:10:29
543
原创 synchronized如何实现有序性、可见性和原子性
原子性指的是一个操作或一系列操作要么全部执行完成并且不被打断,要么完全不执行。保证了被同步块包围的代码在任意时刻只能被一个线程执行。
2024-08-23 10:01:37
573
原创 ++是线程安全的吗
+操作符不是线程安全的,因为它由多个步骤组成。在多线程环境中,如果多个线程同时执行++操作,可能会导致数据不一致。为了解决这个问题,可以使用关键字、类或来确保线程安全。
2024-08-21 19:20:03
382
原创 AQS原理解析
使用者继承并重写指定的方法。将 AQS 组合在自定义同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法。//独占方式。尝试获取资源,成功则返回true,失败则返回false。//独占方式。尝试释放资源,成功则返回true,失败则返回false。//共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。//共享方式。尝试释放资源,成功则返回true,失败则返回false。//该线程是否正在独占资源。
2024-08-19 16:40:11
1051
原创 Springboot启动https安全协议
https协议是http+ssl协议,由于http协议是明文传输的超文本协议,在数据传输过程中,容易被”截胡“,进而导致数据泄露,在重要网站输入用户账户密码时是极为危险的情况。于是Https协议便诞生了,ssl是一个证书,其中会包含一对证书。
2024-08-18 11:05:43
368
原创 当前读和快照读
当前读,也被称为锁定读,它会对读取的行记录加锁,以保证在事务进行期间,读取的数据不会被其他事务修改。这种读操作会实时反映数据库的最新状态,因此被称为“当前”读。在MySQL中,使用以下SQL语句会触发当前读:这些语句会在读取数据的同时,对相应的行记录加上锁,以防止其他事务对其进行修改。这种读方式通常用于需要保证数据一致性的场景,比如金融交易等。示例代码当前读的底层原理:当前读,也被称为锁定读,它会对读取的行记录加锁,以保证在事务进行期间,读取的数据不会被其他事务修改。
2024-08-17 09:33:23
1063
原创 Mysql事务实操
这个简单的示例展示了如何在 MySQL 中使用事务来确保数据的一致性和完整性。事务操作在实际项目中非常重要,特别是在涉及到多个表的复杂操作时。
2024-08-15 16:06:18
787
原创 图遍历算法模板
深度优先遍历用递归+记忆化网格结构的 DFS 与二叉树的 DFS 最大的不同之处在于,遍历中可能遇到遍历过的结点。这是因为,网格结构本质上是一个「图」,我们可以把每个格子看成图中的结点,每个结点有向上下左右的四条边。在图中遍历时,自然可能遇到重复遍历结点。这时候,DFS 可能会不停地「兜圈子」,永远停不下来,如下图所示:如何避免这样的重复遍历呢?答案是标记已经遍历过的格子。以岛屿问题为例,我们需要在所有值为 1 的陆地格子上做 DFS 遍历。
2024-08-14 11:04:54
403
原创 类加载之双亲委派
双亲委派(Parent Delegation)是 Java 类加载机制中的一个重要概念。它指的是当一个类加载器(ClassLoader)需要加载某个类时,它会首先将加载请求委派给它的父类加载器,依次递归,直到顶层的启动类加载器(Bootstrap ClassLoader)。只有在父类加载器无法加载该类时,才会由子类加载器尝试加载。这种机制的优势在于确保了类的唯一性避免了同一个类被多个类加载器加载导致的类重复问题。
2024-08-13 10:42:26
1252
原创 ThreadLocal源码分析&内存泄漏详解
ThreadLocal是多线程中解决线程安全的一个类,它会为每一个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal实现了线程内的资源共享。例如:使用JDBC操作数据库时,会将每一个线程的Connection放入各自的ThreadLocal中,从而保证每个线程都在各自的Connection上进行数据库的操作,避免了A线程关闭B线程的连接。可以说在ThreadLocalMap中存储Key是定义的ThreadLocal对象,Value是实际设置的值。!
2024-08-09 15:21:54
801
原创 创建单例模式的方法
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
2024-08-07 11:18:33
790
原创 Springboot项目集成Skywalking链路追踪系统
Springboot与Skywalking的集成过程总的来说比较简单,第一步就是配置Skywalking,第二部配置Java Agent即可此后可以使用Skywalking来分析哪个接口的执行速度比较慢,由此可以看到SQL的具体执行时间,可以定位到哪个sql出现了问题,有助于解决mysql的慢查询的问题。
2024-07-23 19:00:25
3178
原创 Redis底层数据结构-Dict
Redis的键与值的映射关系是通过Dict来实现的。Dict是由三部分组成,分别是哈希表(DictHashTable),哈希节点(DictEntry),字典(Dict)哈希表结构如下图所示:由于会发生哈希冲突,所以entry个数可能会大于sizesize总是2的n次方哈希节点的结构如下图所示:当我们向Dict添加键值对时,Redis首先根据key计算出hash值(h),然后利用h&sizemask(其实就是h对数组长度取余)计算元素应该存储到数组中哪个索引位置。
2024-04-03 18:50:42
664
原创 Redis底层数据结构-IntSet
其实数组本身只是一个指针,指向起始元素的地址,intset并不依赖于C语言提供的数组相关函数,所有增删改查都是自己来做的。,在本例子中升级编码为INTSET_ENC_INT32,每个整数占4字节,并按照新的编码方式以及元素个数扩容数组.IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并具备长度可变,有序等特征。由此,对这个数组的操作和大小并不是像表面看到的一样,而是由encoding来决定 的。倒序依次(先调整20,10,5)将数组中的元素拷贝到扩容后的正确位置。
2024-04-03 18:49:42
328
原创 Redis底层数据库之SDS
由于len是uint8_t类型,最大值为254,所以字符串最大长度为254(因为char buf[]仍然是C语言的字符串,会有一个结束符)Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是redis中最常用的一种数据结构。假如在该字符串追加一段”,AMY“,那么会去申请新空间(alloc为申请的存放字符的空间,不包含结束字符)所以Redis构建了一种新的字符串结构,成为简单动态字符串,简称SDS。flags:表示不同的结构体类型。uint8_t:表示无符号整型。
2024-04-02 20:24:30
509
原创 Springboot启动https安全协议(JDK生成SSL证书)
https协议是http+ssl协议,由于http协议是明文传输的超文本协议,在数据传输过程中,容易被”截胡“,进而导致数据泄露,在重要网站输入用户账户密码时是极为危险的情况。于是Https协议便诞生了,ssl是一个证书,其中会包含一对证书。
2024-04-02 11:10:09
862
1
原创 MYSQL百万数据查询优化
在查询第100000条记录之后的10条时,耗费时间:0.227s在查询第200000条记录之后的10条时,耗费时间:0.251s在查询第500000条记录之后的10条时,耗费时间:0.916s在查询第800000条记录之后的10条时,耗费时间:1.639s在查询第1000000条记录之后的10条时,耗费时间:2.038s以上叫做深度分页,即查询偏移量过大的场景,这会导致查询性能较低。
2024-03-26 15:18:18
2661
原创 LeetCode 61. 旋转链表
其实像例1中,链表长度length为5,当k为5,10,15时,链表其实是没有变化的,当k为6,11,16时也只是相当于旋转了一次,所以旋转得次数其实是k%length。解题思路:本题中比较简单想法就是使用递归做法,每做一次递归使得k-1,将尾节点接到首节点左边,但是这样做当K特别大时会出现栈溢出的情况。输入:head = [1,2,3,4,5], k = 2。输入:head = [0,1,2], k = 4。链表中节点的数目在范围 [0, 500] 内。输出:[4,5,1,2,3]输出:[2,0,1]
2024-03-25 21:54:55
242
原创 LeetCode215. 数组中的第K个最大元素
为了保证稳定性,随机获取集合中的一个元素pivot进行排序,所以我们可以判断比该pivot元素小的元素个数(low.size()),比该pivot元素大的元素个数(above.size()),以及和该pivot元素相等的元素个数(equal.size())请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。输入: [3,2,3,1,2,4,5,5,6], k = 4。输入: [3,2,1,5,6,4], k = 2。此时我们所知道的是要查找第K大的元素。
2024-03-25 20:37:32
354
原创 LeetCode162. 寻找峰值
这是因为nums[mid-1]>nums[mid],同时左边界为无穷小。此时在nums[0]~nums[mid]中必有峰值元素。就和现实中爬山一样,在nums[mid]端向左爬,是上山,但最终会下到山底,所以必然会有一个山峰。如果nums[mid-1]>nums[mid]那么在左半端必有峰值元素,右半端同理。你可以假设 nums[-1] = nums[n] = -∞。输入:nums = [1,2,1,3,5,6,4]解释:你的函数可以返回索引 1,其峰值元素为 2;输入:nums = [1,2,3,1]
2024-03-23 20:31:02
329
原创 LeetCode148. 排序链表
解决思路:遍历链表中的节点,将其中的值存入list中,然后对list进行排序,重新建立一个链表即可。给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表。时间复杂度为O(n),空间复杂度为O(n),其中n为节点个数。链表中节点的数目在范围 [0, 5 * 104] 内。输入:head = [-1,5,3,4,0]输入:head = [4,2,1,3]输出:[-1,0,3,4,5]输出:[1,2,3,4]输入:head = []
2024-03-22 21:14:55
184
原创 LeetCode103. 二叉树的锯齿形层序遍历
(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。使用两个栈来实现功能,一个全局栈global,一个局部栈temp,此外设置一个标志位label来判断在每一层时保存孩子的顺序。当每一层遍历完毕之后,将局部栈克隆给全局栈,此时全局栈具有下一层的节点。使用全局栈来进行遍历输出节点,在输出的同时将左右孩子节点存入局部栈中。输入:root = [3,9,20,null,null,15,7]输出:[[3],[20,9],[15,7]]输入:root = [1]输入:root = []
2024-03-22 20:53:01
312
原创 springboot3以及上版本引入RocketMQTemplate显示could not be found.
在springboot3时,直接通过依赖来注入RocketMQTemplate会报错,会显示没有这个对象。这是因为在Springboot3以前的版本,自动装配是通过读取所有jar包下的META-INF/spring.factories文件。(可以去查阅而spring.factories功能在spring Boot3.0被移除,替换方案为META-INFO/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。
2024-03-20 18:04:05
1327
原创 红黑树简单介绍
红黑树是一种自平衡二叉查找树,由于自平衡的特性,保证了最坏情况下在O(logn)时间复杂度内完成查找、增加、删除等操作,性能表现稳定。在JDK中,TreeMap、TreeSet以及JDK1.8的HashMap底层都采用了红黑树。
2024-03-20 10:10:56
382
原创 高并发抢票时,防止机器人刷票的令牌大闸,减轻服务器的压力(防刷+限流)
场景1:分布式锁和限流都不能解决机器人刷票的问题,1000个请求抢票,900个限流快速失败,另外100个有可能是同一个在刷库。引入令牌,令牌中记录用户信息,会进行校验用户是否拿过令牌,如果拿过令牌,那么几秒内不允许再获得令牌场景2:没有余票时,需要查库存才能知道没票,会影响性能,不如查询令牌余票来的快令牌的数量是和票数是相关的,令牌可以和票数相等,那么通过查询令牌就可以知道是否还有余票,会减少查询数据库,减少IO压力。
2024-03-19 18:52:50
1393
4
原创 Sentinel基础使用
Warm up效果:coldFactor即为请求QPS从(阈值/3)开始,经过多少预热时长才逐渐升值设定的QPS阈值,比如阈值是100,时长为10秒,则从33开始经过10秒上升到100。最大RT:表示响应时间,如果响应时间大于201ms,当有百分之三十的请求响应时间大于201ms时出发熔断。设置20个线程去请求,理论上来说是第一秒处理10个请求,然后10个请求进行排队等待,在第二秒进行处理。请求,会进行排队等待,如果在500ms内能够接收请求的话就处理,否则就拒绝。一开始的QPS为3,然后慢慢增长到10。
2024-03-18 19:59:37
2192
原创 CornerStone之读取txt文件点数据
/找到上传文件//定义一个读缓冲流//设置读文件的编码格式为UTF-8//类型数组只能存储Number数字型数据,其他数据不允许会赋值为NaN//加载文件//将字符串按照换行符分割为字符串数组i++){//将行数据按照逗号分割为数组j<100;j++){//此时将01数据的矩阵转换为一维矩阵})文件内容如下所示:转换之后的Float32Array数组为。
2024-03-18 11:29:00
214
原创 Jmeter之线程组之间变量的传递
在会员登录请求中,对请求返回的结果进行提取,需要使用JSON提取器(添加/后置处理器/JSON提取器)Names of created variables填入token,即创建的变量名,其值来源于$.content.token(字符表示返回值的根路径)
2024-03-13 22:16:53
620
原创 Redis之红锁
当线程1获取了锁之后,假设此时redis主节点宕机,随之一个副节点马上变成主节点线程2会从新的主节点获得锁,这就发生了互斥的问题。
2024-03-13 22:15:31
1092
原创 SpringBoot和OpenFeign版本依赖问题
当使用Springboot版本为3.2.2时,openfeign版本为3.1.5时。当将openfegin版本设置为4.1.0时即可。解决方法:在maven仓库里找到两者对应的版本。这是因为两者的版本对应失误。如果不对应,会发生诸如。当去远程调用时会报错。
2024-03-02 15:31:27
2913
3
原创 LeetCode5 最长回文子串
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。给你一个字符串 s,找到 s 中最长的回文子串。解释:“aba” 同样是符合题意的答案。输入:s = “babad”输入:s = “cbbd”
2024-02-25 16:01:56
145
原创 SpringBoot自动装配原理
在使用Spring时,需要在XML文件编写配置。即使Spring后面引入了基于注解的配置,在开启某些Spring特性或者引入第三方依赖的时候,仍然需要XML或者Java进行显示配置。需要在XML文件中声明Bean的定义。
2024-02-23 16:01:04
857
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人