- 博客(23)
- 收藏
- 关注
原创 Mysql的MVCC多版本并发控制详解
Read View遵循的可见性算法主要是将要被修改的数据的最新记录中的DB_TRX_ID(当前事务id)取出来,与系统当前其他活跃事务的id去对比,如果DB_TRX_ID跟Read View的属性做了比较,不符合可见性,那么就通过DB_ROLL_PTR回滚指针去取出undolog中的DB_TRX_ID做比较,即遍历链表中的DB_TRX_ID,直到找到满足条件的DB_TRX_ID,这个DB_TRX_ID所在的旧记录就是当前事务能看到的最新老版本数据。在事务3修改该行数据的时,数据库会对该行加排他锁;
2025-03-20 16:40:55
583
原创 10线程池ThreadPoolExecutor专题
核心实现在于销毁线程时,需要先获得worker内部的互斥锁,而在执行任务的过程中需要加锁,这样销毁线程操作时候不会直接中断线程,做到了优雅。
2025-03-12 16:05:46
756
原创 8-BlockingQueue阻塞专题
继承了Queue继承了。具备基本的队列保存元素的功能,同时为元素的存入和取出提供了阻塞功能。指定一个延迟时间,然后延迟时间到达后就可以取出时间没到之前是不能取出这个元素的。
2025-03-10 09:44:18
228
原创 6-ReentrantLock源码解析和Condition机制底层源码剖析
await核心就是加入到 Condition队列然后阻塞等待;signal核心是从Condition队列移动到等待队列,然后LockSupport#unpark()唤醒。核心是线程重入扣减次数和调用AQS方法唤醒后续节点。核心是加锁前判断是否有人排队和已加锁后实现重入。也就是没人加锁的时候,
2025-03-07 14:03:47
148
原创 5-AQS概念和源码分析
表示资源,子类怎么表示statestate表示什么意思是子类决定的。中state表示互斥锁的状态,state=0表示没人加锁,state>0表示有人加锁。Semaphore中表示信号量的个数,state=10表示有10个信号量,state=0时候表示没有信号量了。AQS获取独占锁和释放独占锁的底层源码、核心流程acquire()获取锁和release()释放锁的流程图,假设A已经获得锁执行业务代码然后释放,同时B尝试获取。
2025-02-27 15:51:57
220
原创 4-Atomic原子类专题
使用AtomicInteger、AtomicLong底层的CAS操作竞争非常激烈,会导致大量线程CAS失败而不断自旋,耗费CPU的性能。PS:你的女朋友分手后再和你复合,你的女朋友还是你的女朋友吗?CPU是不会直接写主内存的,上面的操作存在并发问题,需要。方法CAS操作int的值,而这里是compareAnd。,我们只需要掌握常用的一些原子类就可以了。,然后使用volatile修饰变量,确保。来进行加锁的,加锁失败的线程又是通过。,是AtomicReference的。longAccumulate()分析。
2025-02-26 16:38:38
712
原创 3-sychronized专题
monitor叫做对象监视器、也叫作监视器锁,JVM规定了每一个java对象都有一个monitor对象与之对应,这monitor是JVM帮我们创建的,在底层使用C++实现的。其实monitor在底层也是某个类的对象,那个类就是ObjectMonitor。JVM设计的这套synchronized锁升级的原则,主要是为了花费最小的代价能达到加锁的目的。在没有竞争的情况下,进入synchronized的使用使用偏向锁就够了,这样只需要第一次执行CAS操作获取锁。
2025-02-25 09:56:24
344
原创 2-volatitle专题
导致线程B提前跳出了while循环,然后线程B调用。如果是乱序执行:由于线程A先执行了。StoreStore屏障。StoreLoad屏障。volatitle-读。LoadStore屏障。没初始化好,竟然是个。volatile-写。LoadLoad屏障。
2025-02-17 10:30:06
211
原创 1-并发基础
但是由于指令重排序,某个线程执行这几个指令的时候,比如说线程A执行的时候,可能执行 指令3,然后再执行指令2、指令1。导致别的线程,比如说线程B看到线程A的指令执行是乱序的。解决多核CPU的高速缓存数据一致性的问题,必须有个机制能够在CPU0修改了数据之后,立即通知的CPU1,让CPU1的高速缓存上的这个变量数据失效掉;不同的CPU从主内存读取到高速缓存中,经过CPU运算后写到高速缓存,高速缓存写回到主内存,如果同时执行,可能存在CPU0中改了数据,CPU1中又改了,最终不一致的问题。
2025-02-14 10:51:58
462
原创 位运算专题
反码:11111111 11111111 11111111 11111011 (符号位不变,其它位置按位取反)与( & )每一位进行比较,两位都为1,结果为1,否则为0(-4 & 1 = 0)或( | )每一位进行比较,两位有一位是1,结果就是1(-4 | 1 = -3)非( ~ ) 每一位进行比较,按位取反(符号位也要取反)(~ -4 = 3)异或( ^ )每一位进行比较,相同为0,不同为1(1^ -4 = -3)例如:十进制-4转成二进制补码在计算机表示为。例如:十进制4转成二进制补码在计算机表示为。
2025-02-13 16:55:53
242
原创 Spring系列26:Spring AOP 通知与顺序详解
本文内容如何声明通知如何传递参数到通知方法中多种通知多个切面的通知顺序多个切面通知的顺序源码分析与图解声明通知Spring中有5种通知,通过对应的注解来声明:@BeforeBefore 通知,用于方法执行前增强@AfterReturning :After Returning 通知,方法正常执行返回后增强@AfterThrowing:After Throwing 通知,方法执行通过抛出异常退出时@After:After (Finally) 通知,方法执行退出时执行增强,不管是正常返回
2022-03-21 13:43:55
533
原创 Spring系列25:Spring AOP 切点详解
本文内容Spring 10种切点表达式详解切点的组合使用公共切点的定义声明切点@Poincut@Poincut 的使用格式如下:@Poincut("PCD") // 切点表达式 表示对哪些方法进行增强public void pc(){} // 切点签名,返回值必须为void10种切点表达式AspectJ的切点指示符AspectJ pointcut designators (PCD) ,也就是俗称的切点表达式,Spring中支持10种,如下表:表达式类型作用
2022-03-17 14:17:46
1062
原创 Spring系列20:注解详解和Spring注解增强(基础内功)
有部分小伙伴反馈说前面基于注解的Spring中大量使用注解,由于对Java的注解不熟悉,有点难受。建议总结一篇的Java注解的基础知识,那么,它来了!本文内容什么是注解?如何定义注解如何使用注解如何获取注解信息Spring 中对注解做了什么增强?什么是注解?什么是代码中写的注释?那是给开发者看的,但是编译之后的字节码文件中是没有注释信息的,也就是说注释对于java编译器和JVM来说是没有意义的,看不到!类比注释是给人看的,注解则是给java编译器和JVM看的一些标识,编译器和虚拟机在运
2022-03-10 16:02:04
594
原创 Spring系列22:Spring AOP 概念与快速入门篇
本文内容Spring AOP含义和目标AOP相关概念声明式AOP快速入门编程式创建代理对象Spring AOP含义和目标OOP: Object-oriented Programming 面向对象编程,大家再熟悉不过了AOP:Aspect-oriented Programming 面向切面编程面向切面编程通过提供另一种思考程序结构的方式来补充面向对象编程。OOP 中模块化的关键单元是类,而 AOP 中模块化的单元是切面。Spring 的关键组件之一是 AOP 框架。Spring IoC
2022-03-02 18:30:43
340
原创 Spring系列13:bean的生命周期
本文内容bean的完整的生命周期生命周期回调接口Aware接口详解Spring Bean的生命周期面试热题:请描述下Spring的生命周期?4大生命周期从源码角度来说,简单分为4大阶段: 实例化 -> 属性赋值 -> 初始化 -> 销毁实例化 Instantiation属性赋值 Populate初始化 Initialization销毁 Destruction实例化和属性赋值对应构造方法和 setter 方法的注入,初始化和销毁是用户能自定义扩展的两个阶段
2022-02-10 11:06:54
326
原创 Spring系列10:Java-based的Spring容器配置
本文内容快速入门@Configuration 和@Bean`详解其他扫描方式快速入门Spring 新的 Java 配置支持中的核心是 @Configuration 类和 @Bean。@Bean 注解用于表示一个方法实例化、配置和初始化一个由 Spring IoC 容器管理的新对象。对比Spring 的 XML 配置,@Bean 注解与 元素的作用相同。 @Configuration 注释一个类表明它的主要目的是作为 bean 定义的来源。@Configuration 类允许通过调用同一
2022-01-30 14:46:08
649
原创 Spring系列9:基于注解的Spring容器配置
写在前面前面几篇中我们说过,Spring容器支持3种方式进行bean定义信息的配置,现在具体说明下:XML:bean的定义和依赖都在xml文件中配置,比较繁杂。Annotation-based :通过直接的方式注入依赖,xml文件配置扫描包路径,xml简化很多。Java-based: 通过配置类和注解批量扫描和注册bean,不再需要xml文件。前面的案例都是基于XML的,这篇介绍Annotation-based方式。本文内容通过简单案例入门基于注解方式的容器配置使用Autowired的
2022-01-30 14:45:26
1353
原创 Spring系列8:bean的作用域
本文内容bean定义信息的意义介绍6种bean的作用域bean定义信息的意义Spring中区分下类、类定义信息,类实例对象的概念?不容易理解,以餐馆中点炒饭为例。类: 相当于你看到菜单上炒饭这个菜品,有这个菜。类定义信息:相当于炒饭的烹饪法,烹饪法只有一份类实例对象: 相当于按照上面烹饪法炒出来的一份炒饭,可以炒分多份出来。Spring容器中创建了一个类定义信息的,就可以根据这个定义信息来创建个类实例对象出来,这个理解了很关键。Spring中不仅可以控制 bean 对象中的各种依赖项和配
2022-01-30 08:30:42
756
原创 Spring系列7:`autowire`自动装配怎么玩
回顾前几篇我们介绍各种依赖依赖注入,都是显式指定的,配置明确但同时也有些繁杂和重复。"很多发明的出发点,都是为了偷懒,懒人是推动社会进步的原动力"。Spring 提供了自动注入依赖的机制。本文内容什么是自动依赖注入,有什么优点autowire如何使用autowire-candidate 和primary配合自动装配什么是自动依赖注入,有什么优点Spring 容器可以自动装配依赖 bean 之间的关系。 Spring 通过检查 ApplicationContext
2022-01-28 17:17:11
567
原创 Spring系列6:depends-on干预bean创建和销毁顺序
本文内容不使用depends-onbean的初始化和销毁顺序使用depends-on后bean的初始化和销毁顺序depends-on结论和应用场景结论先上初始化: depends-on 属性可以显式地强制一个或多个 bean 在使用这个元素的 bean 被初始化之前被初始化。销毁:depends-on 属性指定的那些依赖bean先销毁,使用这个元素的 bean后被销毁,干预了关闭顺序。结论给完了,我们下面通过案例验证。不使用depends-onbean的初始化和销毁顺序定义3个简单类
2022-01-26 08:19:59
291
原创 Spring系列4:依赖注入的2种方式
本文内容基于构造器的依赖注入基于setter的依赖注入基于构造器的依赖注入案例定义2个简单的bean类,BeanOne 和 BeanTwo,前者依赖后者。package com.crab.spring.ioc.demo02;public class BeanTwo {}package com.crab.spring.ioc.demo02;/** * @author zfd * @version v1.0 * @date 2022/1/12 16:59 */public
2022-01-20 09:00:17
115
原创 Spring系列1:Spring基本概念
本文内容什么是Spring?为什么学Spring?本系列包含哪些技术?本系列适合哪些人?什么是Spring?基本概念Spring 框架为现代基于 Java 的企业应用程序提供了一个全面的编程和配置模型——在任何类型的部署平台上。Spring 使创建 Java 企业应用程序变得容易。它提供了在企业环境中采用 Java 语言所需的一切。目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Ja
2022-01-14 10:36:49
153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人