自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

夜勿语的博客

专注于技术分享

  • 博客(66)
  • 收藏
  • 关注

原创 一文搞懂AQS及其组件的核心原理

前言JDK1.5以前只有synchronized同步锁,并且效率非常低,因此大神Doug Lea自己基于Java写了一套并发框架,这套框架的核心就在于AbstractQueuedSynchronizer类(即AQS),性能非常高,所以被引入JDK包中,即JUC。那么AQS是如何做到高性能的呢?本篇就是对AQS及其相关组件进行分析,了解其原理,并领略大神的优美而又精简的代码。AbstractQueuedSynchronizerAQS是JUC下最核心的类,没有之一,其它的Lock以及并发控制类都是基于这个

2020-10-06 16:45:20 3019 7

原创 synchronized的实现原理——锁膨胀过程

文章目录前言正文轻量锁加、解锁批量重偏向批量撤销前言上一篇分析了优化后的synchronized在不同场景下对象头中的表现形式,还记得那个结论吗?当一个线程第一次获取锁后再去拿锁就是偏向锁,如果有别的线程和当前线程交替执行就膨胀为轻量级锁,如果发生竞争就会膨胀为重量级锁。这句话看起来很简单,但实际上synhronized的膨胀过程是非常复杂的,有许多场景和细节需要考虑,本篇就对其进行详细分析。正文先来看一个案例代码:public class TestInflate { static Th

2020-09-12 17:01:30 1861

原创 你所不知道的Spring的@Autowired实现细节

前言相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Spring中是如何实现的呢?这就要分析Spring源码才能知道了。友情提示:本篇主要是讲解Autowired的实现原理,不会分析Spring初始化的过程,不熟悉的读者可以先阅读笔者之前的一篇文章《这一次搞懂Spring的Bean实例化原理》。正文在Spring Bean的整个创建过程中会调用很多BeanPostProcessor接口的的实现类:上图是我整理的Sp

2020-08-22 11:36:25 2853 2

原创 Mybatis插件扩展以及与Spring整合原理

文章目录前言正文插件扩展1. Interceptor核心实现原理2. Mybatis的拦截增强Mybatis与Spring整合原理1. SqlSessionFactory的创建2. 扫描Mapper并创建代理对象3. 如何整合Spring事务4. FactoryBean的扩展知识总结前言前面几篇文章分析了Mybatis的核心原理,但模块较多,没有一一分析,更多的需要读者自己下来研究。不过Mybatis的插件扩展机制还是非常重要的,像PageHelper就是一个扩展插件,熟悉其扩展原理,才能更好的针对我们

2020-07-09 23:08:31 915

原创 深入Mybatis源码——执行流程

前言上一篇分析Mybatis是如何加载解析XML文件的,本篇紧接上文,分析Mybatis的剩余两个阶段:代理封装和SQL执行。正文代理封装Mybatis有两种方式调用Mapper接口:private static SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);// 第一种try (SqlSession session = sqlMapper.openSession(TransactionI

2020-07-07 22:44:57 1802 2

原创 这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)

文章目录前言正文启动原理事件驱动自动配置原理Condition注解原理总结前言SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本大大增加,需要先了解熟悉Spring原理。如果还不清楚Spring原理的,可以先查看博主之前的文章,本篇主要分析SpringBoot的启动、自动配置、Condition、事件驱动原理。正文启动原理SpringBoot启动非常简单,因其内置了Tomcat,所以只需要通过下面几种方式启动即可

2020-06-26 13:14:34 1575 2

原创 这一次搞懂SpringMVC原理

文章目录前言正文请求入口组件初始化调用Controller参数、返回值解析总结前言前面几篇文章,学习了Spring IOC、Bean实例化过程、AOP、事务的源码和设计思想,了解了Spring的整体运行流程,但如果是web开发,那么必不可少的还有Spring MVC,本篇主要分析在请求调用过程中SpringMVC的实现原理,通过本篇要搞懂它是怎么解决请求、参数、返回值映射等问题的。正文请求入口我们都知道前端调用后端接口时,都会通过Servlet进行转发,而Servlet的声明周期包含下面四个阶段:

2020-06-15 23:43:32 1287

原创 这一次搞懂Spring的Bean实例化原理

文章目录前言正文环境准备两个重要的Processor注册BeanPostProcessor对象Bean对象的创建createBeanInstanceaddSingletonFactorypopulateBeaninitializeBean总结前言前两篇文章分析了Spring XML和注解的解析原理,并将其封装为BeanDefinition对象存放到IOC容器中,而这些只是refresh方法中的其中一个步骤——obtainFreshBeanFactory,接下来就将围绕着这些BeanDefinition对

2020-05-31 20:52:40 3283 2

原创 这一次搞懂Spring的XML解析原理

前言Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率。同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规范,但因其体系庞大、设计复杂对于刚开始阅读源码的人来说是非常困难的。所以在此之前首先你得下定决心,不管有多困难都得坚持下去;其次,最好先把设计模式掌握熟练;然后在开始阅读源码时一定要多画UML类图和时序图,多问自己为什么要这么设计?这样设计的好处是什么?还有没有更好的设计?当然,晕车是难免的,但还是那句话,一定

2020-05-24 16:39:26 1866 5

原创 线上问题——学习记录幂等判断失效问题分析

这次的问题好在对业务没有什么影响,但代码确实写的有问题,考验了对锁、事务以及框架的总和运用和理解。另外在分析问题时不要想当然,先入为主,一定要大胆猜想、亲手验证,只要有发现一点疑点就不应该发放过,因为很有可能就这一个疑点就推翻之前所有的分析。最后附上链路:F947DF6DC8C94E339ED1BAC5AF5E9812(edu-study、edu-study-async),感兴趣的看官可自行分析验证,有问题欢迎指出。

2024-03-04 20:57:28 1021

原创 线上问题——2021-12-27 父子线程共用线程池导致死锁故障

从早上6点开始edu-wings-admin的timer-task和mq就开始报警任务堆积,且数量持续上升,到6点50左右mq也开始告警,8点左右发现问题,开始排查,直到11点才找到问题,任务开始正常消费。

2024-03-03 14:20:18 342 1

原创 线上问题——事务内加分布式锁

一、业务流程上图是对save和saveScore两个接口的流程抽象,save是上传答题数据,saveScore则是上传答题分数,为保证幂等和防止并发调用,这两个接口都加了分布式锁(还是两层哦)。第一层使用的是不同的锁,因为处理的是不同的表,第二层处理的是相同的表,为了保证数据在某个维度上的唯一,所以使用了相同的锁。本篇文章则主要记录下表C中的逻辑唯一键出现重复数据的问题排查过程,该问题包含了对锁、事务及Mybatis框架的综合运用和理解。二、问题分析ROUND 1问题分析最开始只看到了第二层锁的

2022-05-01 16:11:52 2466

原创 如何保证缓存、数据库双写一致性?

序在使用缓存时,我们必须要考虑的是缓存与数据库的双写一致性,是先删缓存还是先更新数据库?是需要强一致性还是最终一致性?延迟双删策略真的就万无一失了吗?虽然网上已经有很多文章分析了,但都比较零散,所以本篇根据自己的经验及网上的文章做了个归纳整理。正篇我们先来看看缓存的更新策略,到底是先删缓存还是先更新数据库?(为什么不更新缓存?因为更新缓存更麻烦,一致性更难保证,所以一般都是采用删除策略,简单、粗暴。)先删缓存再更新数据库如图,如果第一步删除缓存失败,那么事务直接回滚,数据库和缓存是一致的;如果更

2021-12-23 21:31:20 1960

原创 记一次线上SQL索引优化及索引选择错误原理分析

前两天同事负责的订单模块查询出现了一个奇怪的问题,当加入筛选条件后会出现查询超时的问题,查询全部订单的时候没有问题,SQL如下(数据已脱敏,使用的是MySql):SELECT a.consumer_code AS orderCode, a.rent_equipment_snid AS eqSn, a.powerbank_snid AS pbSn, a.rent_merchant_name AS rentMerchant, a.rent_merchant_address AS merchantAd

2020-10-30 14:19:51 1585 3

原创 synchronized的实现原理——对象头解密

前言并发编程式Java基础,同时也是Java最难的一部分,因为与底层操作系统和硬件息息相关,并且程序难以调试。本系列就从synchronized原理开始,逐步深入,领会并发编程之美。正文基础稍微好点的同学应该都知道,Java中获取锁有两种方式,一种是使用synchronized关键字,另外一种就是使用Lock接口的实现类。前者就是Java原生的方式,但在优化以前(JDK1.6)性能都不如Lock,因为在优化之前一旦使用synchronized就会发生系统调用进入内核态,所以性能很差,也因此大神Doug

2020-08-30 12:22:19 810

原创 深入探究JVM之方法调用及Lambda表达式实现原理

文章目录前言正文解析分派静态分派动态分派单分派和多分派动态分派的实现Lambda表达式的实现原理MethodHandle总结前言在最开始讲解JVM内存结构的时候有简单分析过方法的执行原理——每一次方法调用都会生成一个栈帧并压入栈中,方法链的执行就是一个个栈帧弹出栈帧的过程,本篇就从字节码层面详细讲讲方法的调用细节。正文解析Java中方法的调用对应字节码有5条指令:invokestatic:用于调用静态方法。invokespecial:用于调用实例构造器()方法、私有方法和父类中的方法。in

2020-08-05 23:12:46 795

原创 深入探究JVM之类加载与双亲委派机制

文章目录前言类的生命周期加载验证准备解析初始化案例一案例二案例三案例四类加载器类加载器和双亲委派模型破坏双亲委派模型第一次SPITomcatOSGI总结前言前面学习了虚拟机的内存结构、对象的分配和创建,但对象所对应的类是怎么加载到虚拟机中来的呢?加载过程中需要做些什么?什么是双亲委派机制以及为什么要打破双亲委派机制?类的生命周期类的生命周期包含了如上的7个阶段,其中验证、准备、解析统称为连接 ,类的加载主要是前五个阶段,每个阶段基本上保持如上顺序开始(仅仅是开始,实际上执行是交叉混合的),只有解析

2020-08-01 12:21:13 668

原创 深入探究JVM之垃圾回收算法实现细节

文章目录前言垃圾回收算法实现细节根节点枚举安全点安全区域记忆集和卡表写屏障并发的可达性分析低延迟GC前言本篇紧接上文,主要讲解垃圾回收算法的实现细节以及对目前最前沿的低延迟GC(Shenandoah、ZGC)做个介绍。垃圾回收算法实现细节根节点枚举我们知道目前的JVM的垃圾回收器都是采用可达性分析算法标记存活对象,该算法首先需要找到GC Roots,然后通过这些根节点向下搜索,能搜索到的就标记为存活对象,未被标记的最后就会被垃圾回收器回收。那你是否想过垃圾回收器怎么找到GC Roots呢?对于在方

2020-07-27 15:59:25 478 3

原创 深入探究JVM之垃圾回收器

文章目录前言正文一、垃圾收集算法标记-复制标记-清除标记-整理分代回收二、常用的垃圾回收器Serial/SerialOldParNewParallel Scavenge/ParallelOldCMSGarbage First总结前言JVM的自动内存管理得益于不断发展的垃圾回收器,从最初的单线程收集到现在并发收集,垃圾回收器的开发者们一直在致力于如何降低GC过程中的停顿时间(STW)以及提高吞吐量,但直到现在也不存在一款完美的垃圾回收器,只能根据不同的场景选择最合适的。所以需要了解每款垃圾回收器出现的背景

2020-07-25 18:23:12 730

原创 深入探究JVM之对象创建及分配策略

前言Java是面向对象的语言,所谓“万事万物皆对象”就是Java是基于对象来设计程序的,没有对象程序就无法运行(8大基本类型除外),那么对象是如何创建的?在内存中又是怎么分配的呢?正文对象的创建方式在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式:new关键字反射clone反序列化Unsafe.allocateInstance为了便于说明和理解,下文仅针对new出来的对象进行讨论。对象的创建过程Java中对象的创建过程就包含上图中的5个步骤,首先需要验证待创

2020-07-22 22:54:24 1202

原创 深入探究JVM之内存结构及字符串常量池

前言Java作为一种平台无关性的语言,其主要依靠于Java虚拟机——JVM,我们写好的代码会被编译成class文件,再由JVM进行加载、解析、执行,而JVM有统一的规范,所以我们不需要像C++那样需要程序员自己关注平台,大大方便了我们的开发。另外,能够运行在JVM上的并只有Java,只要能够编译生成合乎规范的class文件的语言都是可以跑在JVM上的。而作为一名Java开发,JVM是我们必须要学习了解的基础,也是通向高级及更高层次的必修课;但JVM的体系非常庞大,且术语非常多,所以初学者对此非常的头疼。本

2020-07-20 23:36:53 1258 13

原创 深入Mybatis源码——配置解析

文章目录前言正文配置解析1. cacheRefElement/cacheElement2. resultMapElements3. sqlElement4. buildStatementFromContext总结前言上一篇分析了Mybatis的基础组件,Mybatis的运行调用就是建立在这些基础组件之上的,那它的执行原理又是怎样的呢?在往下之前不妨先思考下如果是你会怎么实现。正文熟悉Mybatis的都知道,在使用Mybatis时需要配置一个mybatis-config.xml文件,另外还需要定义Ma

2020-07-06 22:36:20 664 1

原创 Mybatis源码初探——优雅精良的骨架

前言Mybatis是一款半自动的ORM框架,是目前国内Java web开发的主流ORM框架,因此作为一名开发者非常有必要掌握其实现原理,才能更好的解决我们开发中遇到的问题;同时,Mybatis的架构和源码也是很优雅的,使用了大量的设计模式实现解耦以及高扩展性,所以对其设计思想,我们也非常有必要好好理解掌握。(PS:本文基于3.5.0版本分析)精良的Mybatis骨架宏观设计Mybatsi的源码相较于Spring源码无论是架构还是实现都简单了很多,它所有的代码都在一个工程里面,在这个工程下分了很多包,

2020-07-06 15:23:15 791 4

原创 全网最深分析SpringBoot MVC自动配置失效的原因

前言本来没有计划这一篇文章的,只是在看完SpringBoot核心原理后,突然想到之前开发中遇到的MVC自动失效的问题,虽然网上有很多文章以及官方文档都说明了原因,但还是想亲自看一看,本以为很简单的事情,没想到却引发出一个较复杂的问题,请教了很多人都没有得到结果,网上文章也没有写清楚的,最后还是自己搞了很久才弄明白的,此篇主要记录自己的一个分析过程,。正文引出问题上面是SpringBoot MVC的自动配置,问题是这样的,当我们需要自己配置MVC时,有三种选择:实现WebMvcConfigure

2020-06-29 21:58:12 1458

原创 这一次搞懂Spring Web零xml配置原理以及父子容器关系

前言在使用Spring和SpringMVC的老版本进行开发时,我们需要配置很多的xml文件,非常的繁琐,总是让用户自行选择配置也是非常不好的。基于约定大于配置的规定,Spring提供了很多注解帮助我们简化了大量的xml配置;但是在使用SpringMVC时,我们还会使用到WEB-INF/web.xml,但实际上我们是完全可以使用Java类来取代xml配置的,这也是后来SpringBoott的实现原理。本篇就来看看Spring是如何实现完全的零XML配置。正文先来看一下原始的web.xml配置:<

2020-06-20 13:11:29 817

原创 这一次搞懂Spring事务是如何传播的

文章目录前言正文事务切面的调用过程事务的传播性概念实例分析总结前言上一篇分析了事务注解的解析过程,本质上是将事务封装为切面加入到AOP的执行链中,因此会调用到MethodInceptor的实现类的invoke方法,而事务切面的Interceptor就是TransactionInterceptor,所以本篇直接从该类开始。正文事务切面的调用过程 public Object invoke(MethodInvocation invocation) throws Throwable { // Work

2020-06-12 00:00:09 1028

原创 这一次搞懂Spring事务注解的解析

前言事务我们都知道是什么,而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发,解耦业务逻辑和系统逻辑。但是Spring事务原理是怎样?事务在方法间是如何传播的?为什么有时候事务会失效?接下来几篇文章将重点分析Spring事务源码,让我们彻底搞懂Spring事务的原理。正文XML标签的解析<tx:annotation-driven transaction-manager="transactionManager"/>配置过事务的应该都不陌生,上面这个配

2020-06-09 22:14:13 1239

原创 这一次搞懂Spring代理创建及AOP链式调用过程

文章目录前言正文基本概念代理对象的创建小结AOP链式调用前言AOP,也就是面向切面编程,它可以将公共的代码抽离出来,动态的织入到目标类、目标方法中,大大提高我们编程的效率,也使程序变得更加优雅。如事务、操作日志等都可以使用AOP实现。这种织入可以是在运行期动态生成代理对象实现,也可以在编译期、类加载时期静态织入到代码中。而Spring正是通过第一种方法实现,且在代理类的生成上也有两种方式:JDK Proxy和CGLIB,默认当类实现了接口时使用前者,否则使用后者;另外Spring AOP只能实现对方法的

2020-06-06 18:23:58 1444

原创 Spring IOC原理补充(循环依赖、Bean作用域等)

文章目录前言正文循环依赖什么是循环依赖?Spring是如何解决循环依赖的?作用域实现原理以及如何自定义作用域作用域实现原理自定义ScopeBeanPostProcessor的执行时机SpringBoot零配置实现原理浅析总结前言通过之前的几篇文章将Spring基于XML配置的IOC原理分析完成,但其中还有一些比较重要的细节没有分析总结,比如循环依赖的解决、作用域的实现原理、BeanPostProcessor的执行时机以及SpringBoot零配置实现原理(@ComponentScan、@Import、@

2020-06-02 23:39:57 1106

原创 这一次搞懂Spring自定义标签以及注解解析原理

前言在上一篇文章中分析了Spring是如何解析默认标签的,并封装为BeanDefinition注册到缓存中,这一篇就来看看对于像context这种自定义标签是如何解析的。同时我们常用的注解如:@Service、@Component、@Controller标注的类也是需要在xml中配置<context:component-scan>才能自动注入到IOC容器中,所以本篇也会重点分析注解解析原理。正文自定义标签解析原理在上一篇分析默认标签解析时看到过这个类DefaultBeanDefiniti

2020-05-26 22:50:20 883 1

原创 记一次Idea+Gradle编译Spring源码遇到的坑

打算开始研究Spring源码,于是照着书上的指导从网上下载了Spring5.0.2版本和Gradle4.0(必须JDK1.8.60以上),本地编译的时候没有任何问题,就是导入Idea的时候一直报下面这个错:在网上查了很多资料,有说JKD版本太低,有说Gradle版本不对等等,都试过之后依然报这个错,仔细看了下错误日志,注意到Connect to127.0.0.1:1080 failed,在网上查...

2020-02-28 15:54:57 2545 1

原创 消息队列——Kafka基本使用及原理分析

一、什么是Kafka二、Kafka的基本使用Java三、KafKa原理分析四、总结

2019-11-22 22:51:11 622

原创 消息队列——RabbitMQ的基本使用及高级特性

文章目录一、引言二、基本使用1. 简单示例2. work queue和公平消费消息3. 交换机三、高级特性1. 消息过期2. 死信队列3. 延迟队列4. 优先级队列5. 流量控制a. 服务端限流b. 客户端限流6. 消息可靠性a. 如何确保消息发送到交换机b. 如何确保消息正确路由到队列c. 消息持久化存储d. 如何确保消息正确投递到消费者e. 如何保证消息幂等性f. 如何保证消息的顺序四、总结...

2019-11-12 20:14:30 590

原创 MongoDB——基本使用及集群搭建

文章目录什么是MongoDb?基本概念与关系型数据库的比较Mongo的高效性文件存储基本使用启动/连接服务基础操作命令高可用集群搭建应用场景总结什么是MongoDb?基本概念MongoDB是一种支持多语言面向文档的NOSql数据库,它不支持事务操作(4.2版本开始支持跨文档分布式事务)。什么是面向文档?简单说就是使用类JSON的数据结构——BSON(Binary JSON)来存储数据。使用这...

2019-10-31 22:09:54 574

原创 消息队列——ActiveMQ使用及原理浅析

文章目录引言正文一、ActiveMQ是如何产生的?产生背景JMS规范基本概念JMS体系结构二、如何使用?基本功能消息传递P2Ppub/sub持久订阅消息传递的可靠性事务型会话与非事务型会话持久化与非持久化消息的存储策略消息发送策略三、原理浅析发送原理消费原理消费消息流程消息确认及消息重发四、基本优化总结引言什么是消息中间件?随着业务的急速增长以及分布式架构的逐渐兴起,首先要考虑的就是如何高效的...

2019-09-11 20:01:09 2470

原创 Dubbo——服务目录

引言前面几篇文章分析了Dubbo的核心工作原理,本篇将对之前涉及到但却未细讲的服务目录进行深入分析,在开始之前先结合前面的文章思考下什么是服务目录?它的作用是什么?正文概念及作用清楚Dubbo的调用过程就知道Dubbo在客户端和服务端都会为服务生成一个Invoker执行体,这个Invoker包含了所有的配置信息,也相当于是一个代理对象,所以这也就引发出几个问题:怎么管理Invoker?...

2019-09-10 08:11:20 1271

原创 Dubbo——服务调用过程

文章目录引言服务的交互服务降级集群容错服务调用服务端接收请求总结引言经过之前文章的铺垫,现在可以来分析服务的交互调用过程了。服务的交互服务降级从名字上看我们不难理解MockClusterInvoker相当于是对普通Invoker(如DubboInvoker)的装饰增强,提供集群容错相关的功能,因此最终还是会进入到DubboInvoker,所以这里就以MockClusterInvoker....

2019-09-07 21:42:47 748

原创 Dubbo——服务引用

引言上一篇我们分析了服务发布的原理,可以看到最终默认是创建了一个Netty server,这一篇

2019-09-03 14:42:22 1228

原创 Dubbo——服务发布原理

引言在使用Dubbo的时候你一定会好奇它是怎么实现RPC的,而要了解它的调用过程,必然需要先了解其服务发布/订阅的过程,本篇将详细讨论Dubbo的发布过程。源码分析新学Dubbo大都会比较疑惑,服务启动时的入口在哪?是如何加载我们的配置的?由于Dubbo是基于Spring的自定义扩展标签来实现配置的,而发布服务时我们需要配置dubbo:service标签,因此我们可以从这里入手。首先我们需...

2019-08-31 18:57:00 1536

原创 Dubbo——SPI及自适应扩展原理

文章目录引言正文一、什么是SPI?1. Java SPI的实现2. Dubbo SPI实现原理由配置文件得到的猜想SPI源码二、自适应扩展机制三、Dubbo IOC引言Dubbo虽然已交由apache管理,并且社区活跃度也不如SpringCloud,但也是国内应用比较广泛的RPC框架,其背后的设计思想非常值得我们学习借鉴。鉴于Dubbo官方文档对于基础的使用配置已经讲解的非常清楚了,这里就不再...

2019-08-27 18:42:11 1839 2

空空如也

空空如也

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

TA关注的人

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