源码分析
文章平均质量分 96
从源码角度进行剖析
SunAlwaysOnline
开始工作的第3年!
展开
-
从Curator实现分布式锁的源码再到羊群效应
本文从源码角度讲解了使用Curator获取分布式锁的流程,接着从等待锁的演化过程角度出发,分析了Zookeeper在分布式锁场景下避免羊群效应的解决方案。原创 2022-01-02 23:02:07 · 2062 阅读 · 1 评论 -
Redis哨兵机制原理浅析
一、前言上一篇文章Redis主从复制原理中简要地说明了主从复制的一个基本原理,包含全量复制、复制积压缓冲区与增量复制等内容,有兴趣的同学可以先看下。利用主从复制,可以实现读写分离、数据备份等功能。但如果主库宕机后,需要运维人员手动地将一个从库提升为新主库,并将其他从库slaveof新主库,以此来实现故障恢复。因此,主从模式的一个缺点,就在于无法实现自动化地故障恢复。Redis后来引入了哨兵机制,哨兵机制大大提升了系统的高可用性。二、什么是哨兵哨兵,就是站岗放哨的,时刻监控周围的一举一动原创 2021-12-30 23:32:23 · 2655 阅读 · 6 评论 -
面试官:能给我画个Zookeeper选举的图吗?
Zookeeper是一个分布式协调框架,提供分布式锁、配置项管理、服务注册与集群管理等功能。为了保证Zookeeper的高可用,一般都会以集群的模式部署。这个时候需要考虑各个节点的数据一致性,那么集群在启动时,需要先选举出一位Leader,再由Leader完成向其他节点的数据同步工作。本文将是Zookeeper系列的第一篇文章,从源码角度讲述Zookeeper的选举算法。原创 2021-12-26 17:19:48 · 2035 阅读 · 2 评论 -
Redisson可重入与锁续期源码分析
Redisson是一个可以在java项目中使用的Redis客户端,其屏蔽了原子性、可重入、锁续期的诸多细节,内部实现各种各样的锁。例如可重入锁、公平锁、MultiLock与Red Lock与读写锁等,今天主要分析可重入锁与锁续期的源码。原创 2021-12-18 00:42:03 · 2877 阅读 · 4 评论 -
从源码中窥探出事务失效的8种原因
核心流程解读我们从一段简单的代码入手,从头到尾分析以下其中的奥秘。如果在一个controller中调用service方法,该方法被@Transaction注解修饰。controller方法: @GetMapping("/save") public String saveStudent() { testService.save(); return "success"; }service方法: @Transactional原创 2021-11-30 23:45:47 · 1557 阅读 · 0 评论 -
从源码角度结合详细图例剖析过滤器与拦截器
过滤器示例:@Componentpublic class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter.init"); } @Override public void doFilter(ServletRequest se原创 2021-11-14 22:30:35 · 2943 阅读 · 2 评论 -
一次因线程池使用不当造成生产事故的排查记录与思考
某日当我点开熟悉的界面,一个又一个请求失败的提示赫然出现在屏幕上,不会是昨晚上线的代码有问题吧?吓得我急忙按F12查看了响应——"exception":"java.lang.OutOfMemoryError","message":"unable to create new native thread"出现了内存溢出的情况,无法创建更多的本地线程。接着查看了实例的监控大盘,发现每个实例的JVM线程数量都处于9000+的规模,且还有上涨的趋势。这是其中一个实例的线程数量监控图:10.原创 2021-11-09 23:51:03 · 3990 阅读 · 7 评论 -
还记不住Spring Bean的生命周期?看这篇你就知道方法了!
一、前言上次我们在手把手教你解决循环依赖,一步一步地来窥探出三级缓存的奥秘中分析了Spring解决循环依赖的方式,在第6节中的doCreateBean(AbstractAutowireCapableBeanFactory类中)其实已经隐约看到了Bean的生命周期的几个阶段。 protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] ar原创 2021-10-16 23:33:53 · 4148 阅读 · 7 评论 -
单例模式的6大种类,如何保证线程安全、反射安全以及序列化安全,这次终于通透了
单例模式在日常的开发过程中,我们需要使用到设计模式,而单例模式可谓是最常见的一种。正确的使用单例模式,不仅可以降低内存的使用率,也可以提升整个程序的运行效率。下面我来谈谈自己对单例模式的理解。【1】懒汉式特点:(1)是一种牺牲时间换取空间的策略(2)懒加载,只在需要的时候才实例化对象public class Singleton { private static Singlet...原创 2021-10-06 17:25:58 · 2470 阅读 · 3 评论 -
手把手教你解决循环依赖,一步一步地来窥探出三级缓存的奥秘
先不去管Spring中的循环依赖,我们先实现一个自定义注解,来模拟@Autowired的功能。一、自定义注解模拟@Autowired自定义Load注解,被该注解标识的字段,将会进行自动注入/** * @author qcy * @create 2021/10/02 13:31:20 *///只用在字段上@Target(ElementType.FIELD)//运行时有效,这样可以通过反射解析注解@Retention(RetentionPolicy.RUNTIME)public @原创 2021-10-03 23:10:01 · 3771 阅读 · 10 评论 -
还不清楚JDK动态代理?从简单例子到源码再到字节码讲给你听
一、前言Spring中的AOP思想就是对代理模式的经典运用,下面先讲讲代理模式的核心思想,以静态代理为例。二、静态代理示例下面有这样一个例子,委托人在遭遇利益受损的时候,可以委托律师帮忙打官司。先定义一个描述行为的接口:package com.design.proxy.statics;public interface Action { void handle();}委托人,实现这个接口,主要的行为是寻找律师。package com.design.proxy.s原创 2021-09-10 00:00:45 · 936 阅读 · 0 评论 -
深度思考:老生常谈的双亲委派机制,JDBC、Tomcat是怎么反其道而行之的?
要说双亲委派机制,还得从类加载器的类型谈起一、类加载器的类型类加载器有以下种类:启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类加载器(Application ClassLoader)启动类加载器内嵌在JVM内核中的加载器,由C++语言编写(因此也不会继承ClassLoader),是类加载器层次中最顶层的加载器。用于加载java的核心类库,即加载jre/lib/rt.jar里所有的class。由于启动类加载器原创 2021-09-05 22:47:01 · 2571 阅读 · 9 评论 -
SpringBoot的自动装配原理、自定义starter与spi机制,一网打尽
一、前言Spring简直是java企业级应用开发人员的春天,我们可以通过Spring提供的ioc容器,避免硬编码带来的程序过度耦合。但是,启动一个Spring应用程序也绝非易事,他需要大量且繁琐的xml配置,开发人员压根不能全身心的投入到业务中去。因此,SpringBoot诞生了,虽然本质上还是属于Spring,但是SpringBoot的优势在于以下两个特点:(1)约定大于配置SpringBoot定义了项目的基本骨架,例如各个环境的配置文件统一放到resource中,使用active来启原创 2021-08-24 23:51:52 · 10064 阅读 · 14 评论 -
ThreadLocal源码、InheritableThreadLocal与内存泄露,这一篇给你捋顺了
ThreadLocal,可以理解为线程局部变量。同一份变量在每一个线程中都保存一份副本,线程对该副本的操作对其他线程完全是不可见的,是封闭的。一、ThreadLocal简单示例public class Main { private static ThreadLocal<Integer> tl = new ThreadLocal<>(); public static void main(String[] args) { tl.set(1)原创 2021-08-16 23:10:49 · 2437 阅读 · 2 评论 -
Ribbon源码分析
Ribbon是Netflix公司开源的一个客户端负载均衡的项目,一般配合Eureka使用。不过为了降低其他干扰因素,专注于Ribbon,这一次我们脱离Eureka讲Ribbon。上一篇我们讲了RestTemplate源码分析,今天这一篇打算使用@Ribbon注解使得RestTemplate具有负载均衡的能力。一、简单的例子首先引入ribbon的依赖() <dependency> <groupId>org.springframew原创 2021-08-14 14:01:43 · 1901 阅读 · 0 评论 -
RestTemplate源码分析
相信RestTemplate是我们在SpringBoot中用过的最多的http客户端,今天来分析他的源码。一、最简单的用法首先需要向容器中注入RestTemplate的Bean实例@Configurationpublic class RestTemplateConfig { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); }}接着直接使用即可原创 2021-08-07 16:45:32 · 2433 阅读 · 4 评论