一文讲清跨代引用问题
一、跨代引用问题 假设老年代的 A 对象引用新生代的 B 对象,那在 young GC 的时候,仅仅从新生代的 GC root 出发就会以为 B 是垃圾,导致错误回收,而如果从整个 GC root 出发遍历成本就太高了。因此用记忆集来解决这个问题,在记忆集中保存从非收集区域(A 所在的老年代)指向收集区域(B 所在的新生代)的指针集合,在 youn…
从源码出发,一文读懂 Bean 的初始化流程及三级缓存机制
spring 通过三级缓存来解决 Bean 的循环依赖问题,该机制的相关代码主要位于DefaultSingletonBeanRegistry 类中。下面将从该类的源码出发,重新学习三级缓存机制。 注意:三级缓存机制只能解决 setter 注入的循环依赖问题,如果是构造器注入的方式,使用反射的方式进行注入,用三级缓存也是不能解决循环依赖问题…
既然 CPU 有 MESI 协议保障多核心缓存一致性,为什么 JMM 还需要考虑线程间共享变量的可见性问题呢?
这个问题是在学习 CPU 的缓存一致性中冒出来的。现在网络上大多数对于 volatile 功能的描述是下面这样的: volatile 提供两大功能:实现线程间共享变量的可见性 + 禁止指令的重排序。这两大功能是通过在对 volatile 变量的操作前后添加对应的内存屏障实现的,内存屏障最粗略分有两类,读内存屏障和写内存屏障,作用分别是从主内存中读取…
详解线程间的变量传递
为什么多线程之间需要通信? 在一些需要多个线程通通完成一个任务的场景下,需要线程之间的互相协调和同步。比如一个线程的执行依赖于另一个线程的结果、多个线程需要按顺序协调交替运行。 多线程通信大致可以分为两种 —— 共享内存 & 消息传递 1 共享内存 多个线程可以访问同一个共享的内存区域,通过读取和写入内存中的数据来进行通讯同步。比如堆中的对…