随笔分类 -  Java

摘要:在上一章笔者介绍了ConfigurationClassParser.doProcessConfigurationClass(...)方法,在这个方法里调用了processImports(...)方法处理配置类的@Import注解,getImports(sourceClass)能从一个配置类上获取@I 阅读全文
posted @ 2021-08-28 22:06 北洛 阅读(283) 评论(0) 推荐(0) 编辑
摘要:上一个章节,笔者向大家介绍了spring是如何来过滤配置类的,下面我们来看看在过滤出配置类后,spring是如何来解析配置类的。首先过滤出来的配置类会存放在configCandidates列表, 在代码<1>处会先根据配置类的权重做一个排序,权重越低的配置类排在越前,在解析的时候也越先解析。之后会根 阅读全文
posted @ 2021-08-22 21:06 北洛 阅读(185) 评论(0) 推荐(0) 编辑
摘要:ConfigurationClassPostProcessor 在前面一个章节,笔者和大家介绍了在构造一个应用上下文时,spring会执行到PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(...)方法,我们已经清楚这 阅读全文
posted @ 2021-08-18 21:11 北洛 阅读(322) 评论(0) 推荐(0) 编辑
摘要:在上一章中笔者介绍了refresh()的<1>处是如何获取beanFactory对象,下面我们要来学习refresh()方法的<2>处是如何调用invokeBeanFactoryPostProcessors方法执行bean工厂后置处理器,这个方法在笔者看来是整个refresh()方法最重要的方法之一 阅读全文
posted @ 2021-08-05 18:36 北洛 阅读(192) 评论(0) 推荐(0) 编辑
摘要:先前,笔者和大家一起了解了ReentrantReadWriteLock的写锁实现,其实写锁本身实现的逻辑很少,基本上还是复用AQS内部的等待队列思想。下面,我们来看看ReentrantReadWriteLock的读锁实现。 当调用读锁的lock()方法时,会调用到Sync的父类AQS实现的acqui 阅读全文
posted @ 2021-07-08 20:36 北洛 阅读(197) 评论(0) 推荐(0) 编辑
摘要:ReentrantReadWriteLock 前情提要:在学习本章前,需要先了解笔者先前讲解过的ReentrantLock源码解析和Semaphore源码解析,这两章介绍了很多方法都是本章的铺垫。下面,我们进入本章正题ReentrantReadWriteLock。 ReentrantReadWrit 阅读全文
posted @ 2021-07-08 05:39 北洛 阅读(279) 评论(0) 推荐(0) 编辑
摘要:在上一章,我们学习了信号量(Semaphore)是如何请求许可证的,下面我们来看看要如何归还许可证。 可以看到当我们要归还许可证时,不论是调用release()或是release(int permits),都会调用AQS实现的releaseShared(int arg)方法。在releaseShar 阅读全文
posted @ 2021-07-04 18:09 北洛 阅读(251) 评论(0) 推荐(0) 编辑
摘要:Semaphore 前情提要:在学习本章前,需要先了解笔者先前讲解过的ReentrantLock源码解析,ReentrantLock源码解析里介绍的方法有很多是本章的铺垫。下面,我们进入本章正题Semaphore。 从概念上来讲,信号量(Semaphore)会维护一组许可证用于限制线程对资源的访问, 阅读全文
posted @ 2021-07-04 09:36 北洛 阅读(278) 评论(0) 推荐(0) 编辑
摘要:Condition 在上一章中,我们大概了解了Condition的使用,下面我们来看看Condition再juc的实现。juc下Condition本质上是一个接口,它只定义了这个接口的使用方式,具体的实现其实是交由子类完成。 public interface Condition { void awa 阅读全文
posted @ 2021-07-01 19:06 北洛 阅读(162) 评论(0) 推荐(0) 编辑
摘要:ReentrantLock和BlockingQueue 首先,看到这个标题,不要怀疑自己进错文章,也不要怀疑笔者写错,哈哈。本章笔者会从BlockingQueue(阻塞队列)的角度,看看juc包下的阻塞队列是如何使用ReentrantLock。这个章节笔者会介绍部分阻塞队列的源码,但不会着墨过多,我 阅读全文
posted @ 2021-06-30 18:59 北洛 阅读(236) 评论(0) 推荐(0) 编辑
摘要:在了解如何加锁时候,我们再来了解如何解锁。可重入互斥锁ReentrantLock的解锁方法unlock()并不区分是公平锁还是非公平锁,Sync类并没有实现release(int arg)方法,这里会实现调用其父类AbstractQueuedSynchronizer的release(int arg) 阅读全文
posted @ 2021-06-29 12:56 北洛 阅读(263) 评论(0) 推荐(0) 编辑
摘要:ReentrantLock ReentrantLock是一种可重入的互斥锁,它的行为和作用与关键字synchronized有些类似,在并发场景下可以让多个线程按照一定的顺序访问同一资源。相比synchronized,ReentrantLock多了可扩展的能力,比如我们可以创建一个名为MyReentr 阅读全文
posted @ 2021-06-29 05:56 北洛 阅读(427) 评论(0) 推荐(0) 编辑
摘要:Worker 先前,笔者讲解到ThreadPoolExecutor.addWorker(Runnable firstTask, boolean core),在这个方法中工作线程可能创建成功,也可能创建失败,具体视线程池的边界条件,以及当前内存情况而定。 那么,如果线程池当前的状态,是允许创建Work 阅读全文
posted @ 2021-02-28 20:56 北洛 阅读(256) 评论(0) 推荐(1) 编辑
摘要:ThreadPoolExecutor ThreadPoolExecutor是ExecutorService的一种实现,可以用若干已经池化的线程执行被提交的任务。使用线程池可以帮助我们限定和整合程序资源,尽可能避免创建新的线程来执行任务从而降低任务调用的开销,在执行大量异步任务的时候反而能获得更好的性 阅读全文
posted @ 2021-02-25 22:31 北洛 阅读(323) 评论(0) 推荐(0) 编辑
摘要:线程池 假设我们编写了一个Servlet应用,当用户通过浏览器发起一个请求到达我们服务器时,传统的Servlet应用一般针对一个用户请求创建一个线程去执行请求,等到请求执行完毕后,再销毁线程。这种设计在用户量几百或者几千的情况下一般不会有什么大问题,但是如果我们的用户量上达几万甚至几十万几百万,频繁 阅读全文
posted @ 2021-02-16 18:56 北洛 阅读(183) 评论(0) 推荐(0) 编辑
摘要:上一章,我们介绍了在AnnotationConfigApplicationContext初始化的时候,会创建AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner两个对象: public class AnnotationConfigA 阅读全文
posted @ 2020-12-01 21:06 北洛 阅读(460) 评论(0) 推荐(1) 编辑
摘要:BeanFactoryPostProcessor 在前面几个章节,笔者有介绍过BeanFactoryPostProcessor接口,在spring在解析BeanDefinition之后,根据BeanDefinition初始化bean之前,会回调我们编写的BeanFactoryPostProcesso 阅读全文
posted @ 2020-11-14 17:36 北洛 阅读(770) 评论(0) 推荐(1) 编辑
摘要:构造参数 spring允许我们在XML文件中可以配置一个bean的构造参数,这些属性最终会存放进BeanDefinition的constructorArgumentValues属性中: <bean id="amy" class="org.example.beans.Person"> <constru 阅读全文
posted @ 2020-10-27 08:31 北洛 阅读(344) 评论(0) 推荐(0) 编辑
摘要:BeanDefinition 在spring中,BeanDefinition是十分重要的概念,可以说绝大部分的bean,都是从BeanDefinition产生的。那么BeanDefinition到底是什么呢?在回答这个问题前,我们先来思考Java是如何产生一个对象的?要产生一个Java对象,最基础是 阅读全文
posted @ 2020-10-27 08:26 北洛 阅读(1007) 评论(0) 推荐(0) 编辑
摘要:基于注解的容器配置 spring允许我们用注解来代替XML配置,至于是注解更好还是XML更好视情况而定,一般开发人员喜欢使用注解来进行配置,因为这样更靠近代码;而运维更喜欢XML配置,来决定服务运行的环境,比如:数据库配置。spring不但允许两种不同配置风格的存在,甚至还能混合使用。 谈到注解,@ 阅读全文
posted @ 2020-10-19 20:36 北洛 阅读(183) 评论(0) 推荐(0) 编辑