自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 RateLimiter 原理

限流器

2023-01-31 15:43:07 455

原创 spring 中 mybaits 的一级缓存失效

mybatis

2023-01-30 12:31:26 650

原创 eureka 读写锁的一点思考

eureka

2023-01-29 18:52:50 372

原创 分析一下spring循环依赖

spring 三级缓存

2023-01-29 16:46:21 686

原创 redisson公平锁与非公平原理

redis

2022-08-16 17:18:03 1069

原创 springclout Config刷新配置源码解析

springcloud

2022-06-28 11:19:15 269

原创 mybatis在spring中的执行流程

mybatis

2022-06-22 10:48:31 340

原创 spring 的 mybatis 整合源码解析

mybatis

2022-06-20 22:52:19 102

原创 二战spring_FactoryBean

spring

2022-06-19 13:43:39 103

原创 二战spring_启动流程

spring

2022-06-19 10:17:53 74

原创 eureka三级缓存源码级解析

服务端增量获取注册表eureka 的三级缓存可以说是设计的整个中间件非常大的亮点,这里以增量获取注册表信息为例,直接从服务端开始进行分析我们直接来到获取缓存的部分@VisibleForTesting Value getValue(final Key key, boolean useReadOnlyCache) { Value payload = null; ...... if (useReadOnlyCache) {

2021-02-22 15:54:37 1442

原创 springboot 启动流程

spring 启动 public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { //从springboot return new SpringApplication(primarySources).run(args); }这里主要分为两步,一个是spring Application的构造方法另一步时执行 run()SpringApplication()

2021-02-06 13:37:37 88

原创 LinedBlockingQueue 源码解析

构造方法 public LinkedBlockingQueue() { this(Integer.MAX_VALUE); }空参构造方法,也就是说没有传入大小,队列的大小默认为Integer的最大值属性 private final int capacity;//容量 private final AtomicInteger count = new AtomicInteger();//存储的元素个数 transient Node<E> head

2021-01-04 15:22:54 117 1

原创 ScheduledThreadPoolExecutor 源码解析

概述ScheduledThreadPoolExecutor 常常用来作为延迟任务,或者是周期性执行某个任务延迟任务简单的使用示如下,如果需要周期性执行任务,使用 scheduleAtFixedRate() public static void main(String[] args) throws ClassNotFoundException, ExecutionException, InterruptedException { ScheduledThreadPoolExecutor s

2021-01-04 14:22:56 120

原创 Callable 源码解析

概述这里Callable 的使用以 FutureTask 举例,源码示例如下 public static void main(String[] args) throws ClassNotFoundException, ExecutionException, InterruptedException { FutureTask futureTask = new FutureTask(new Callable() { @Override pub

2021-01-04 13:03:16 261

原创 ArrayBlockingQueue 源码解析

ArrayBlockingQueue 属性首先来看看ArrayBlockingQueue 的属性public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private static final long serialVersionUID = -817911632652898426

2020-12-31 00:11:18 142 2

原创 线程池提交任务和执行任务源码解析(2)

概述因为篇幅太长所以分两篇博客进行说明,本文算是对《线程池提交任务和执行任务源码解析》的补充第一篇博客《线程池提交任务和执行任务源码解析》—》https://blog.csdn.net/kznsbs/article/details/111958345继续execute()方法的说明 public void execute(Runnable command) { ... int c = ctl.get(); if (workerCountOf(c)

2020-12-30 23:01:51 84

原创 线程池提交任务和执行任务源码解析

线程池提交我们就按照平时使用的方式,从execute()这以execute这个方法为入口 public void execute(Runnable command) { ... int c = ctl.get(); if (workerCountOf(c) < corePoolSize) { if (addWorker(command, true)) return;

2020-12-30 14:23:10 194

原创 rocketmq 消息发送

概述rocketmq的消息发送大体可以分为三部1.消息的验证2.队列的选择3.消息的发送消息的验证以send 方法为入口 public SendResult send( Message msg) throws MQClientException, RemotingException, MQBrokerException, InterruptedException { Validators.checkMessage(msg, this);//消息验证

2020-12-29 17:27:05 480 2

原创 Rocketmq 故障延迟 源码解析

故障延迟在 rocketmq 中,有两种延迟机制1. 开启故障延迟2. 关闭故障延迟(默认)关闭故障延迟通过 sendLatencyFaultEnable = false 表示关闭故障延迟所谓的关闭故障延迟就是,在生产者发送消息的时候,可能因为网络原因或者是其他外接因素,导致消息发送失败,这个时候就会进行消息发送的重试(单向消息除外)那么在 broker 端机会记录一下这个失败的broker,所以下次轮询到这个broker 的时候就会跳过这个broker,这样就减少了消息发送失败的概率这里关于

2020-12-29 15:28:03 639 5

原创 mybatis 插件执行原理

Interceptorpublic interface Interceptor { Object intercept(Invocation invocation) throws Throwable; default Object plugin(Object target) { return Plugin.wrap(target, this); } default void setProperties(Properties properties) { // NOP }

2020-12-20 21:44:37 107

原创 spring 循环依赖源码解析

循环依赖循环依赖在java中其实并不是一个问题而是一个现象,例如public class AService{ public BService bservice;}public class BService{ public AService aService;} AService aService = new AService();BService bService = new BService();aService.bService = bService;bService.aServi

2020-12-08 00:20:37 99

原创 springBean的实例化过程详解---createBeanInstance(2)

回到createBeanInstance Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR || mbd.hasConstructorArgumentValues() || !ObjectUtils.i

2020-12-05 15:40:16 184

原创 springBean的实例化过程详解---createBeanInstance(1)

概述spring bean的实例化是在bean的沈明周期中createBeanInstance实现的createBeanInstance Class<?> beanClass = resolveBeanClass(mbd, beanName); if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed())

2020-12-04 16:44:58 475 1

原创 Spring之 @Configuration 解析

概述在 spring 进行 执行refresh() 的invokeBeanFactoryPostProcessors(beanFactory),其中最重要的是执行ConfigurationClassPostProcessor 的postProcessBeanDefinitionRegistry()和 postProcessBeanFactory()这两个方法在 postProcessBeanDefinitionRegistry()中,会进行类的扫描,然后生成对应的 beanDefinition,在这个过

2020-12-04 13:16:45 332

原创 RocketMQ--NameServer启动

概述NameServer 可以说式 Broker 的注册中心,Broker 在启动的时候,会根据配置信息向所有的 NameServer 进行注册,NameServer 会和每和前来注册的 Broker 保持长连接,并每 30s 检查 Broker 是否还存活,对于宕机的 Broker ,NameServer 会将其从列表中剔除当生产者需要向 Broker 发送消息的时候,就会先从 NameServer 里面获取 Broker 的地址列表,然后负载均衡,选择一台消息服务器进行发送Name Server

2020-12-03 16:59:12 1094

原创 spring源码解析之ConfigurationClassPostProcessor

概述在invokeBeanFactoryPostProcessors中,spring回对spring中默认的BeanFactory的后置处理器进行调用,而这里相关的最主要的类就是ConfigurationClassPostProcessor,ConfigurationClassPostProcessor这个类继承自BeanDefinitionRegistryPostProcessor,而BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcess

2020-12-03 15:49:59 171

原创 netty源码解析之编码和解码

概述关于客户端读取数据的核心是 unsafe 的read()方法,对于客户端的unsafe而言 其具体的实现类是NioByteUnsaferead()public final void read() { final ChannelConfig config = config(); if (shouldBreakReadReady(config)) { clearReadPending();

2020-12-02 21:19:52 298

原创 Spring源码之invokeBeanFactoryPostProcessors()

invokeBeanFactoryPostProcessors概述一般情况下:执行到这个方法的beanFactory的beanDefinitionMap中有6个BeanDefinition,5个基础BeanDefinition+AppConfig的 BeanDefinition而这6个中只有一个BeanFactoryPostProcessor:ConfigurationClassPostProcessor这里会执行ConfigurationClassPostProcessor进行@Component

2020-12-02 12:30:06 104

原创 netty源码解析---selector.run() (2)

概述本文是对《netty源码解析—selector.run()》一文的后续补充,在《netty源码解析—selector.run()》分析完成了switch部分,那么接下来开始分析netty 的事件轮询部分,以及后续processSelectedKeys(处理完switch部分,就开始进行事件轮询的,核心的方法就是 processSelectedKeys() private void processSelectedKeys() { if (selectedKeys != nul

2020-11-24 17:44:37 156

原创 netty源码解析---selector.run()

概述本文将对netty的选择器的工作原理进行解析run()直接步入正题!!!protected void run() { for (;;) { try { try { switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) { case SelectStrate

2020-11-23 18:48:13 154

原创 netty之wakeup详解

有关wakeup变量的使用有一下几个地方(这里只使用netty普通任务举例,不讨论定时任务)部分1,NioEventLoop.select() if (hasTasks() && wakenUp.compareAndSet(false, true)) { selector.selectNow(); selectCnt = 1; break;

2020-11-23 18:11:14 906 3

原创 netty源码解析---bind()(4)---dobind0()

概述接着笔者的上一篇博客《netty源码解析—bind()(3)—register0()》,在完成register0()的调用之后,又会回到doBind()方法继续执行,到目前位置bossGroup的selector 还没有对任何事件感兴趣,也没有为服务端进行任何ip以及端口的绑定dobind0()private static void doBind0( final ChannelFuture regFuture, final Channel channel,

2020-11-22 15:34:03 291

原创 netty源码解析---bind()(3)---register0()

概述在netty的bind方法里,经过 channel(NioServerSocketChannel) 的实例化后初始化后,开始向pipeline里添加 handler,然后还会调用register向 bossGroup 里面注册 channel(NioServerSocketChannel),但是这里只会先将这个register0 方法作为一个任务放入任务队列中,然后就会开启reactor ,接着这个线程就会开始执行之前的任务队列,就会执行register0register0()private vo

2020-11-20 17:56:19 433

原创 netty源码解析---bind()(2)

概述《netty源码解析—bind()》一文的细节补充init().addLast()当netty获取到channel后,会向channel的pipeline 里面添加ChannelInitializer 这个handler追溯到addLast()方法的最底层public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) { //group=nul

2020-11-20 14:56:54 104

原创 Spring什么周期之销毁

触发销毁当我们在独立使用spring框架的时候往往会发现,标注了@PreDestory的方法并没有在进程结束前调用,没有触发生命周期的销毁方法,那么如何去触发销毁的生命周期方法呢?有两种方式1.调用applicationContext.close(),这种方式可以说是手动的去关闭容器,触发生命周期销毁2.调用applicationContext.registerShutdownHook(); 这种方式是通过注册一个钩子函数触发生命周期的销毁其实方式一和方式二都是调用到doClose(),所以接下来看

2020-11-19 17:19:33 1042 1

原创 netty源码解析---bind()

概述bind()方法用于用于进行端口号的绑定bind() public ChannelFuture bind(int inetPort) { return bind(new InetSocketAddress(inetPort)); }new InetSocketAddress(inetPort) 里面会将本机的ip和传入的端口封装为InetSocketAddress对象深挖进入dobind()private ChannelFuture doBind(final SocketAdd

2020-11-18 19:13:42 528

原创 netty源码解析---bootStrap的初始化

概述本文主要讲述bootStrap的初始化group()这里以服务端的初始化为例子//删除了非核心代码public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) { super.group(parentGroup); this.childGroup = childGroup; return this; }从这里的初始化可以看出,对于

2020-11-17 21:48:06 130

原创 netty源码解析---bossGroup初始化

概述本文主要讲述netty bossGroup初始化相关流程初始化bossGroup实际类型是,NioEventLoopGroup,即然探究初始化流程,那么直接进入构造方法 public NioEventLoopGroup(int nThreads, Executor executor, final SelectorProvider selectorProvider, final SelectStrategyFactory select

2020-11-17 21:28:16 339 1

原创 @Resource源码解析

概述@Resource这个注解在实现上很类似,但是于@Autowired在一般情况下是先byType,再byName,但是@Resource则相反,通知@Resource还可以单独制定注入的bean的名字,具体实现也是通过一个后置处理器进行实现的,这个后置处理是CommonAnnotationBeanPostProcessor@Resource的自动注入对于@Resource的自动注入而言,其注入的方法也是postProcessProperties这个方法public PropertyValues

2020-11-11 17:09:17 781

空空如也

空空如也

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

TA关注的人

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