- 博客(29)
- 收藏
- 关注
原创 MySQL事务隔离级别详解
隔离级别脏读不可重复读幻读性能适用场景读未提交(RU)可能可能可能最高极少使用读已提交(RC)不可能可能可能较高并发要求高,一致性要求低可重复读(RR)不可能不可能不可能中等大多数业务(MySQL 默认)串行化不可能不可能不可能最低极高一致性场景。
2025-08-14 21:26:54
452
原创 Mysql底层的锁机制
MySQL 中最常用的存储引擎是(支持事务和行级锁)在日常开发中,mysql默认用的是行级锁:执行增删改()或带锁的查询()时,InnoDB 会自动加行级锁。排他锁(x锁):执行增删改(会加 S 锁,允许其他线程加 S 锁(共同读),但阻止加 X 锁(修改)。
2025-08-14 18:19:54
173
原创 Mvcc是如何实现的
当事务修改数据时,旧数据会被复制到 undo 日志中,成为历史版本。新数据写入表中,同时更新 DB_TRX_ID(当前事务 ID)和 DB_ROLL_PTR(指向 undo 日志中的旧版本)。这样一行数据就有了多个版本,通过回滚指针串联成‘版本链’。:事务查询时,数据库会生成一个 Read View,记录当前活跃的事务 ID(未提交的事务)。“MVCC 的实现依赖三个关键机制:隐藏列、undo 日志和 Read View。
2025-08-13 14:45:18
237
原创 产生死锁的条件以及如何破解
资源只能被一个线程占用(如一把锁只能被一个线程持有),其他线程只能等待。例:线程 A 持有锁 1,线程 B 无法同时持有锁 1,只能等待。线程已经持有至少一个资源,又提出新的资源请求,而新资源被其他线程持有,此时线程不会释放已持有的资源,继续等待。例:线程 A 持有锁 1,又想获取线程 B 持有的锁 2,同时不释放锁 1。线程已持有的资源不能被强制剥夺,只能由线程主动释放。例:线程 A 持有锁 1,线程 B 不能强行夺走锁 1,只能等线程 A 主动释放。
2025-08-13 12:10:50
832
原创 CompletableFuture用法
是 Java 8 引入的一个强大工具,用于处理异步编程,它不仅能像Future那样获取异步任务的结果,还支持链式调用、组合多个异步任务、处理异常等复杂操作,让异步代码更简洁、易维护。
2025-08-13 09:38:34
534
原创 线程池发生线程异常,销毁还是复用
如果用的execute()提交的任务,会直接终止线程,打印错误日志,然后新创建一个线程。在这种情况下,线程不会因为异常而终止,它会继续存在于线程池中,准备执行后续的任务。方法时,可以捕获到一个。
2025-08-13 08:28:26
153
原创 ThreadLocal的原理和用法
ThreadLocal核心是本地存储,核心作用是线程隔离get()remove()底层原理是每一个线程都有自己的专属map。
2025-08-12 22:43:15
164
原创 悲观锁和乐观锁
悲观锁:悲观锁的核心是 “”,其他线程看到标签就会等待。想最坏的情况,所以说只能一个一个线程进行,并发差加锁的方式分为隐式加锁和显式加锁。
2025-08-12 21:42:02
249
原创 线程的生命周期和状态
TIME_WAITING:超时等待状态,可以在指定的时间后自行返回而不是像 WAITING 那样一直等待。WAITING:等待状态,表示该线程需要等待其他线程做出一些特定动作(通知或中断)。TERMINATED:终止状态,表示该线程已经运行完毕。RUNNABLE: 运行状态,线程被调用了。初始时期:线程还没有start。阻塞状态:需要等到锁释放。
2025-08-12 18:07:23
164
原创 hashmap底层的理解
数组的容量是2的幂次方的16,32...这样方便计算,当我有数据放进来,首先是根据数据的名字计算哈希值,根据哈希值算出来你应该放到哪一个数组里面,然后可能有可能多个数据都放到一个数组里面,这个就叫做哈希碰撞,多的话也不怕,首先会形成链表,如果说桶的数量超过8,而且数组的长度超过64的时候,链表就会优化成为红黑树,在就是说,如果数组的里面的内容超过了百分之75,就会成2的倍数增长,未来的话,保护线程安全由ConcurrentHashMap通过分段锁来看管。
2025-08-12 16:21:51
197
原创 fail-fast和fail-safe
fail-fast是 “及时报错” 机制,通过检测modCount快速发现并发修改,适用于单线程或已知无并发修改的场景,优点是轻量高效,缺点是不允许迭代中修改集合。fail-safe是 “快照迭代” 机制,通过复制数据避免迭代受修改影响,适用于多线程并发修改的场景,优点是迭代安全无异常,缺点是内存开销大且可能读取旧数据。选择哪种机制取决于场景:单线程优先用fail-fast集合(如ArrayList),多线程并发修改则需用fail-safe并发集合(如。
2025-08-12 14:05:41
260
原创 反射的解释和用法总结
反射是java提供的一种动态获取和操作类信息的机制,就是说,在代码的编译期,不知道代码源码的情况下,然后在代码的运行时期,通过.class文件获取类信息,然后动态创建对象和方法或者修改字段” 获取类里面的方法,构造器。:用反射将数据库查询结果映射到 Java 对象的字段(不管字段是公有还是私有);)的生效,都依赖反射在运行时扫描并处理注解标记的类或方法。等注解的类,动态创建 Bean,并通过。调用任意构造器(包括私有构造,需用。即使不知道方法名,也能通过。:所有自定义注解(如。
2025-08-11 22:14:14
362
原创 BigDecimal是怎么避免精度丢失的?
无法用有限的二进制位数精确表示,只能存储近似值,从而导致精度丢失。,它们的存储和运算基于二进制(基数为 2)。但很多十进制小数(如。BigDecimal是通过整数+标度来存储的。
2025-08-11 10:39:29
305
原创 Integer 缓存机制(IntegerCache)
/ 确保最大值不超过 Integer.MAX_VALUE - (-low) -1。// 缓存数组,存储Integer对象。// 缓存的最小值(固定不可变)// 计算缓存数组大小。// 缓存的最大值(可配置)// 依次创建并存储。private IntegerCache() {} // 私有构造方法,禁止实例化。// 3. 填充缓存数组:创建从 low 到 high 的所有整数对象。// 1. 设置缓存的最大值(默认127,可通过系统属性修改)// 赋值给缓存数组。// 2. 初始化缓存数组。
2025-08-11 10:33:59
401
原创 2. 什么是Redis缓存击穿?如何解决?
缓存击穿是指在高并发场景下,当一个热点数据的缓存失效(例如过期),并且该数据刚好被多个请求同时访问时,由于没有及时被更新到缓存中,所有请求都直接查询数据库,造成数据库的访问压力剧增,可能导致数据库的性能问题。
2025-04-21 19:49:53
768
原创 缓存击穿问题
一般用逻辑过期,查数据的时候,因为主要还是在查数据库写入新的缓存的时候时间比较耗时,所以单开一个线程,当这个查询和更新线程没结束,返回的就是老的数据,省去了很多时间,所以说效率高,但是数据的一致性欠缺。的key突然失效了,无数的访问会在瞬间给数据库带来巨大的压力,主要还是出现在高并发的的时候。1.互斥锁(性能比较差),因为当多个线程的时候,只有一个线程能工作,其他的只能等着。2.逻辑过期,在传入redis的时候传入一个逻辑的过期时间。缓存击穿问题也叫热点Key问题,就是一个被。
2025-04-21 15:55:40
144
原创 缓存雪崩问题的原理和解决方案
出现的原因主要是当redis的缓存失效或者宕机的时候,大量的请求会打入数据库,导致雪崩。1.给不同的key的TTL添加随机值(在预热的时候,把缓存时间设为随机数)2.利用redis集群提高服务的可用性(宕机的时候有用,保证高可用性)3.给缓存业务添加降级限流策略(当一整个redis集群全部挂掉的时候)4.给业务添加多级缓存(多个层面进行缓存,相当于防弹衣)
2025-04-21 15:16:36
180
原创 redis缓存穿透问题的解决
而在这个更新请求中,先查数据库,然后再进行redis的缓存处理,可以避免多线程问题带来的影响.主要是指有人查一个数据库里也没有、缓存里也没有的 key,不断打爆你的数据库。这个问题一般在查询场景才需要专门处理,//缺点:短暂不一致性和内存压力。1.查 Redis 没有。
2025-04-21 14:52:12
231
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅