r.queue = ENQUEUED; // 关注这里
r.next = (head == null) ? r : head;
head = r;
queueLength++;
if (r instanceof FinalReference) {
sun.misc.VM.addFinalRefCount(1);
}
lock.notifyAll();
return true;
}
}
}
- Enqueue
进入队列中的Reference 中的 next 为队列中一个引用,或等于this(表示当前引用为最后一个), queue = ReferenceQueue.ENQUEUE。
- InActive
queue = ReferenceQueue.NULL; next = this
JAVA 四种引用的理解就到这了,其实 JAVA 中还有一种引用,java.lang.ref.FinalReference 应用,不过修饰符是 default, 包访问权限,主要用于 finalizer方法的执行,请关注下一篇博文。
再统一聊聊 java 引用中涉及到的引用的几个队列。
Reference中涉及到的队列(链表)
Reference next;
private static Reference pending = null;
private ReferenceQueue queue;
每个引用可以关联一个引用队列,该引用队列由应用程序创建的,,然后垃圾回收器在检测到引用不可达时,将该引用加入到该队列,应用程序可以根据该引用队列来做些处理。(也就是该引用队列 成为 垃圾回收器与应用程序的通信机制)。
ReferenceQueue 自身的结构
private volatile Reference<? extends T> head = null;
首先,应用程序如下使用引用:
public class TestReference {
private static ReferenceQueue aQueue = new ReferenceQueue();
public static void main(String args) {
Object a = new Object(); // 代码1
WeakReference ref = new WeakReference( a, aQueue );
}
}
然后在程序运行过程,内存不断消耗,直至触发垃圾回收操作。此时,垃圾收集器发现 代码1处的 a 所指向的对象,只有 ref引用它,从根路径不可达,故垃圾回收器,会将 ref 引用加入到 static Reference pending 链表中。【注意,此代码是写在JVM实现中的】
所处理的操作无非就是【 1、如果pending 为空,则将当前引用(ref) 设置为pengding,并且将 ref对象的next指针指向自己; 如果pending不为空,则将当前的引用(ref)的next指向pengding,然后pengding = 当前的引用ref 】,所以 pengding 其实就是 一个后进新出的链表单向链表结构。
- 由此总结出 ref 与 pengding链表关联的第一步 由JVM垃圾回收器完成。
从pengding 链表中取出引用,进行入队操作。该操作由专门的线程(ReferenceHandle 线程处理),我重点将 ReferenceHandle线程的源代码贴出已供分析。
private static class ReferenceHandler extends Thread {
ReferenceHandler(ThreadGroup g, String name) {
super(g, name);
}
public void run() {
for (;😉 {
Reference r;
synchronized (lock) {
if (pending != null) { // 如果pengding不为空,则取出pengding 的第一个引用,然后重新设置pengding 的值(为原来的pending.next,见如下代码 a,b,c)
r = pending; // a 将pending取出,准备入队操作
Reference rn = r.next; // b 先获取原先pending 的 next
pending = (rn == r) ? null : rn; // c 如果pending的next等于本身,则设在pending为空,否则为链表的下一个。// 从这里更加看出 pending 是后进先出队列。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。



由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)

完结
Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。
Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

e的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。
Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。
[外链图片转存中…(img-ctlmyHtI-1710401700757)]
86万+

被折叠的 条评论
为什么被折叠?



