思考: 1.1 Spring为什么要去提供 AopContext (Aop上下文呢?) 看部分代码:源自 JdkDynamicAopProxy 这里根据变量 exposeProxy将 Aop暴露到上下文中去了 // true -> 需要将当前代理对象 "暴露"到 Aop上下文(AopContext)中去 // 暴露后, 应用程序便能获取到 proxy if (this.advised.exposeProxy) { // Make invocation available if necess…
思考: 1.1 Spring为什么要去提供 AopContext (Aop上下文呢?) 看部分代码:源自 JdkDynamicAopProxy 这里根据变量 exposeProxy将 Aop暴露到上下文中去了 // true -> 需要将当前代理对象 "暴露"到 Aop上下文(AopContext)中去 // 暴露后, 应用程序便能获取到 proxy if (this.advised.exposeProxy) { // Make invocation available if necess…
IO模型 同步阻塞、同步非阻塞、多路复用、异步非阻塞 实际上,真正的数据读取得通过 os内核来完成,Java层面提供的 api实际上是去 请求系统调用的! 当调用一次 channel.read或 stream.read后,会切换至 os内核态来完成真正数据的读取,而这个读取数据的过程又分为了 两个阶段: 等待数据阶段:等待客户端发送数据,客户端数据到达后,然后从 网卡中被复制到内核的某个缓冲区 复制数据阶段:把数据从内核缓冲区复制到进程缓冲区 《 Unix网络编程》一书中提及了五种 IO模型: 阻塞 IO 发起一个…
@Slf4j public class MultiThreadServer { // 获取 cpu核心数 private static final int cpu = Runtime.getRuntime().availableProcessors(); public static void main(String[] args) throws IOException { Thread.currentThread().setName("boss"); Selector boss = Select…
// 使用 Selector // 这里需要区分两个集合: // 一个是注册 channel的集合, // 一个是事件发生后存储对应 channel管理 SelectionKey的集合 - selectedKeys // 对于后者需要处理事件后删除对于的 SelectionKey @Slf4j public class Server { public static void main(String[] args) throws IOException { // 使用 NIO来理解阻塞模式, 单线程 // 1.创建 …
Index Concurrent Control 我们的系统中存在着大量的线程,这样做的目的是来 最大化并行能力,或者是最大程度上减少我们想要执行查询时的延迟 因此,当我们想通过多线程来更新和访问我们的数据结构,我们该如何保证线程安全? 目前市场上主流的数据库都支持多线程,但还是存在些例外: Redis:基于单线程的内存数据库 VoltDB:虽然是多线程的数据库,但其以某种方式将数据库进行分割,即每个 B+Tree只能由一条单个线程来进行访问 实际上,我们保护我们的数据结构的方式是通过一种 并发协议 或 并发方案来…
CyclicBarrier 循环屏障 适用场景:多个线程之间相互等待 源码 构造 public CyclicBarrier(int parties) { this(parties, null); } /** * parites: barrier需要参与的线程数量, 每次屏障需要参与的线程数 * barrierAction: 当前 "代"最后一个到位的线程, 需要执行的事件 (可以为 null) */ public CyclicBarrier(int parties, Runnable barri…
最近在看 CyclicBarrier的源码,这里先贴出个 CyclicBarrier的 demo,之后会来更新 CyclicBarrier的源码 源码真的很重要,从源码层面理解了其工作原理,不仅能加深你对并发领域组件的设计的理解,而且在实际使用时能够减少一些 "坑" /** * 模拟王者荣耀 */ public class MyCyclicBarrierDemo { public static void main(String[] args) { String[] names = new Str…
Trie Tree 实际上,如果在没有遍历底部叶子节点的情况下,我们就能够在树的顶部弄清楚 key是否存在的话,这就很 nice! 前缀树 别名:prefix tree、digital search tree Trie Tree是比 B+Tree更加古老的存在 对于 Trie Tree,它并没有保存我们树中节点里的 key的完整拷贝,保存的会是 key的 digit (key中的某些原子子集,如:一个字节或者一个 bit之类的) 基本思想:对 key进行分解,基于一层层来表示 digit,对于重复出现的 key或者…
初始化事件传播器 initApplicationEventMulticaster initApplicationEventMulticaster protected void initApplicationEventMulticaster() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); /** 条件成立, 说明用户自定义了事件传播器, 用户可以来实现 ApplicationEventMulticaster接口, 写一款自己的时间…
子类扩展 postProcessBeanFactory BeanFactoryPostProcessor @FunctionalInterface public interface BeanFactoryPostProcessor { /** * 此处将 IOC容器本身传递了过来,只要属性容器本身,此时便可以去做一些额外的事:移除某些 beanDefinition,添加某些 beanDefinition, * 或去修改覆盖某些 bean的属性值也是可以的 * 可以对容器中已经存在的 bd信息做任何相关的操作 * 这…
容器扩展 本次主要来分析 AbstractApplicationContext.fresh() 前面的视角都主要放在了 BeanFactory接口之上,实际在工作开发过程中,并不会直接玩 BeanFactory,而是选择 ApplicationContext接口实现 这一次,让我们彻底来弄清楚 BeanFactory和 ApplicationContext二者之间的关系! ApplicationContext内部持有了 BeanFactory,ApplicationContext会在 BeanFactory初始过程…
什么是属性编辑器? 其实就是来进行类型转换来完成 bean的依赖注入的 来看个 demo: <bean id="stu" class="ioc.editor.Student"> <property name="birthday" value="2020-05-31" /> </bean> public class Student { private Date birthday; public Date…
COPYRIGHT © 2020 良夜的博客. ALL RIGHTS RESERVED.
This blog has been running:
本站由
This site is protected by wp-copyrightpro.com