- 博客(276)
- 收藏
- 关注
原创 mysql锁表的原因及mysql行锁
只有执行计划真正使用了索引,才能使用行锁:即便在条件中使用了索引字段,但是否使用索引来检索数据是由 MySQL 通过判断不同执行计划的代价来决定的,如果 MySQL 认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下 InnoDB 将使用表锁,而不是行锁。因此,在分析锁冲突时,可以通过 explain 检查 SQL 的执行计划,以确认是否真正使用了索引。
2024-04-24 11:23:46 319
原创 多线程-AQS
通过维护一个volatile变量state表示同步状态,当state为0时表示没有线程占用同步状态,当state为1时表示有一个线程占用同步状态。当多个线程竞争同步状态时,只有一个线程可以成功占用同步状态,其余线程将加入到AQS的同步队列中等待。当占用同步状态的线程释放同步状态时,AQS会从同步队列中选择一个线程唤醒,使其重新尝试获取同步状态。使用模板方法设计模式的思想,将同步状态的管理 、 阻塞队列和线程的阻塞唤醒等处理流程定义成固定的模板。组件开发者无需关注底层细节,只需要重写少数几个相关方法即可。
2024-03-11 16:41:44 400
原创 多线程-原子类实现
Atomic 原子操作类是基于无锁 CAS + volatile 实现的,并且类中的所有方法都使用 final 修饰,进一步保证线程安全。用带版本号的原子引用类AtomicStampedReference解决ABA问题。CAS会带来一个问题:ABA问题。
2024-03-11 16:23:05 415
原创 Mysql隔离级别的实现
1.针对快照读,通过 MVCC 方式解决了幻读 补充:串行化所有的数据库都没做,不过mvcc实现的效果跟串行化差不太多了,可以说是伪串行化解决,2.针对当前读,记录锁+间隙锁解决。
2024-03-11 16:13:32 538
原创 多线程-死锁和避免死锁的方式
线程A、B,资源C、D,线程A持有C请求D,线程B持有D请求C,形成一个相互等待的状态,即为死锁。确保线程请求和释放锁顺序相同、超时释放锁、避免一个线程在持有一个锁的同时去请求另一个锁。
2024-03-08 09:57:22 414
原创 分布式事务-分布式事务协调器
分布式事务协调器:通知参与者都会尝试执行事务操作、通知参与者发送提交请求、然后每个参与者都会提交他们的事务。如果任何参与者在出现失败,协调器则会通知所有参与者进行事务的回滚。在分布式事务中通常使用两段提交、三段提交协议进行,这其中就涉及分布式协调器。
2024-03-07 14:39:59 484
原创 RabbitMq常见问题
消息全局 ID 或者写个唯一标识(如时间戳、UUID 等) :每次消费消息之前根据消息 id 去判断该消息是否已消费过,如果已经消费过,则不处理这条消息,否则正常消费消息,并且进行入库操作。难道消息还会丢失,没错,系统是在一个复杂的环境,不要想的太简单了,虽然以上的三种方案,基本可以保证消息的高可用不丢失的问题。使用rabbitmq提供的ack机制,这样就解决了,即使一个消费者出了问题,但不会同步消息给服务端,会有其他的消费端去消费,保证了消息不丢的场景。刚消费到,还没处理,结果进程挂了,比如重启了。
2024-03-06 09:53:07 585
原创 concurrent包下常用类
CAS 操作包含三个操作数 —— 内存值(V)、预期值(A)和新值(B)。如果内存值(V)和预期值(A)的值是一样的,那么才会将内存里面的值更新成新值(B)CAS是通过无限循环来获取数据的,若果在第一轮循环中,a线程获取内存值(V)被b线程修改了,那么a线程需要自旋,到下次循环才有可能机会执行。JDK8 HashMap的实现,采用了数组+链表+红黑树的实现方式来设计,内部大量采用CAS操作。在JDK1.7中ConcurrentHashMap采用了数组+Segment+分段锁的方式实现。
2024-02-28 11:13:51 356
原创 设计模式分类
被问到常用的设计模式可回答:工厂模式、单例模式、建造者模式、适配器模式、策略模式、模板方法模式、责任链模式。设计模式分为三大类:创建型、结构型、行为型三大类。
2024-02-28 10:48:51 360
原创 @Transactional底层原理
Transactional注解底层是基于Spring AOP来进行实现的,而Spring AOP,是基于动态代理实现JDK代理和Cglib代理实现的,常考记住。当发生方法内调用的时候,被调用的函数尽管看起来加了事务注解,但是被调用的函数是没有被执行代理到的,导致注解跟没写一样。把@Transactional注解加在private修饰的方法也会一样的现象。解决方案是把方法放到另外一个类里,让Spring自动为其生成代理对象。
2024-02-28 10:38:03 655
原创 JVM-垃圾回收器和垃圾回收算法
g1垃圾回收器:G1(Garbage First):是一款垃圾优先的回收器,使用复制算法,G1将堆内存分为很多更小的(Region)区域(物理上不连续,逻辑上连续),然后有计划地对堆内存进行垃圾回收,回收时,优先回收垃圾最多的区域。cms垃圾回收器:使用标记清除算法,会从产生内存碎片,当大作业到来时,可能会提前出发full gc,cms标记垃圾和清除垃圾都是和用户线程并发执行,这时用户线程产生的新垃圾对象就是浮动对象。jvm中垃圾回收算法有四种:标记整理、标记清除、复制算法、分代收集算法。
2024-02-28 10:09:25 978
原创 Springboot 添加拦截器
2.实现WebMvcConfigurer 接口把拦截器添加到其中。1.实现HandlerInterceptor 接口。
2023-05-17 17:39:20 359
原创 @ExceptionHandler(value = Exception.class)
【代码】@ExceptionHandler(value = Exception.class)
2023-05-17 17:38:03 260
原创 mybatis map作为参数使用foeach批量update数据
在日常中也会遇到需要使用map作为参数使用foreach更新update数据的情况,此时该如何用呐?
2022-07-13 10:19:53 2011
原创 分库分表,Sharding-JDBC水平分表
随着数据量的增大,就可能会达到性能瓶颈,比如千万数据,增删改都很慢,这时候就需要考虑分库分表了了解一下水平分表,数据库、表不变,创建相同结构的数据库 称为水平分库 创建相同结构的表 称为水平分表...
2022-07-08 16:37:03 226
原创 Redis排行榜简单实现
最近在学Redis,用Redis实现一个简单的排行榜功能排行榜初始化类:主要功能是在项目启动时将表数据添加到Redis中,Redis中有的数据不做处理,Redis中无的数据将数据添加到Redis中测试类有两个,一个用于给商品的score值加分,模拟用户操作,用户点击一次,该商品的score值加一次,这样榜单排名的效果就出来了reverseRangeWithScores方法:逆序(从大到小)取出榜单的前5名incrementScore方法,给指定商品加score值...
2022-06-23 15:41:04 687
原创 Redis数据同步到Mysql
秒杀系统中总需要在启动时将数据放到redis中,即缓存预热,在秒杀开始时则需要通过redis进行库存的扣减,为保证redis和mysql数据一致性,通过可通过定时任务将redis中的数据同步回mysql中
2022-06-22 11:27:36 3685
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人