- 浏览: 209684 次
- 性别:
- 来自: 哈尔滨
文章分类
- 全部博客 (267)
- java.lang (8)
- 问题汇总 (21)
- 异常记录 (20)
- 功能实现 (19)
- 面试总结 (25)
- 技巧总结 (8)
- 常用代码 (4)
- 编程习惯 (3)
- 编码规则 (3)
- java.util (10)
- java.io (1)
- JavaWeb (9)
- MySQL (16)
- SVN (3)
- MyBatis (11)
- Velocity (7)
- 其他知识 (10)
- 人生哲理 (1)
- 人生故事 (1)
- 自我感悟 (1)
- shiro (3)
- 基础知识 (0)
- 问题总结 (1)
- Spring 标签 (1)
- Spring (3)
- 点滴生活 (1)
- DOS (1)
- CAS (4)
- Linux (9)
- Storm (6)
- Shell (1)
- regex (1)
- Collection (4)
- poi (1)
- 经典语句 (1)
- NIO (5)
- concurrent (14)
- RPC (1)
- zookeeper (3)
- 待整理 (2)
- Hadoop (9)
- RabbitMq (2)
- flume (1)
- hive (7)
- hbase (4)
- kafka (1)
- scala (1)
- GC (0)
- java.util.concurrent.atomic (1)
- java.lang.ref (6)
- JVM (2)
- algorithm (1)
- conception (1)
- java key word (1)
- sun.misc (1)
最新评论
ReferenceQueue
一、总结
1.jkd 1.8.0
2.作用
该队列作为引用中的一员,可以和上述三种引用类型组合使用,该队列的作用是:创建Reference时,将Queue注册到Reference中,当该Reference所引用的对象被垃圾收集器回收时,会将该Reference放到该队列中,相当于一种通知机制。
二、源码分析
/** * Reference queues, to which registered reference objects are appended by the * garbage collector after the appropriate reachability changes are detected. * * @author Mark Reinhold * @since 1.2 */ public class ReferenceQueue<T> { }
- Reference queues,在适当的时候检测到对象的可达性发生改变后,垃圾回收器就将已注册的引用对象添加到此队列中。
/** * Constructs a new reference-object queue. */ public ReferenceQueue() { }
- 构造方法,需指定泛型
// 私有内部静态类 Null ,继承 ReferenceQueue ,并覆盖实现父类中的方法 enqueue private static class Null<S> extends ReferenceQueue<S> { boolean enqueue(Reference<? extends S> r) { return false; } } // Reference 对象出队列标识,即 Reference 状态,由 Enqueued 变为 Inactive static ReferenceQueue<Object> NULL = new Null<>(); // Reference 对象入队列标识,即 Reference 状态,由 Pending 变为 Enqueued static ReferenceQueue<Object> ENQUEUED = new Null<>();
- 出队、入队标识,队列指的是 Reference 构造方法中 ReferenceQueue 参数
static private class Lock { }; private Lock lock = new Lock();
- 锁:类对象锁
private volatile Reference<? extends T> head = null;
- 列表头部
- 作用:出队、入队操作时,作为临时变量保存数据
private long queueLength = 0;
- 队列中元素的个数
- 类中的属性,实例对象私有,Reference 构造方法需要传入 ReferenceQueue 的实例对象,此属性指的是传入对象的队列中的对象的数量
boolean enqueue(Reference<? extends T> r) { /* Called only by Reference class */ synchronized (lock) { // Check that since getting the lock this reference hasn't already been // enqueued (and even then removed) ReferenceQueue<?> queue = r.queue; // 检查需要入队的 Reference 对象,对象的 queue 属性是否已经有标识 // 即已经做过入队、出队的处理 if ((queue == NULL) || (queue == ENQUEUED)) { return false; } // 断言 assert queue == this; // 入队处理,入队标识 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; } }
- 添加入队标识
- 新加入的元素在队列头部
@SuppressWarnings("unchecked") private Reference<? extends T> reallyPoll() { /* Must hold lock */ Reference<? extends T> r = head; if (r != null) { // r.next == r 仅有一个元素 head = (r.next == r) ? null : r.next; // Unchecked due to the next field having a raw type in Reference r.queue = NULL; // 出队元素的next 指向自己 r.next = r; queueLength--; if (r instanceof FinalReference) { sun.misc.VM.addFinalRefCount(-1); } return r; } return null; } /** * Polls this queue to see if a reference object is available. If one is * available without further delay then it is removed from the queue and * returned. Otherwise this method immediately returns <tt>null</tt>. * * @return A reference object, if one was immediately available, * otherwise <code>null</code> */ public Reference<? extends T> poll() { if (head == null) return null; synchronized (lock) { return reallyPoll(); } }
- 添加出队标识
- 从头部开始出队,先入后出
/** * Removes the next reference object in this queue, blocking until either * one becomes available or the given timeout period expires. * * <p> This method does not offer real-time guarantees: It schedules the * timeout as if by invoking the {@link Object#wait(long)} method. * * @param timeout If positive, block for up to <code>timeout</code> * milliseconds while waiting for a reference to be * added to this queue. If zero, block indefinitely. * * @return A reference object, if one was available within the specified * timeout period, otherwise <code>null</code> * * @throws IllegalArgumentException * If the value of the timeout argument is negative * * @throws InterruptedException * If the timeout wait is interrupted */ public Reference<? extends T> remove(long timeout) throws IllegalArgumentException, InterruptedException { if (timeout < 0) { throw new IllegalArgumentException("Negative timeout value"); } synchronized (lock) { Reference<? extends T> r = reallyPoll(); if (r != null) return r; long start = (timeout == 0) ? 0 : System.nanoTime(); for (;;) { lock.wait(timeout); r = reallyPoll(); if (r != null) return r; if (timeout != 0) { long end = System.nanoTime(); timeout -= (end - start) / 1000_000; if (timeout <= 0) return null; start = end; } } } } /** * Removes the next reference object in this queue, blocking until one * becomes available. * * @return A reference object, blocking until one becomes available * @throws InterruptedException If the wait is interrupted */ public Reference<? extends T> remove() throws InterruptedException { return remove(0); } }
- 删除队列中的下一个引用对象,阻塞队列直到一个引用对象变为可达
博文参考:
Java Reference 源码分析
发表评论
-
Reference
2017-11-19 17:11 672Reference 一、总结 1.jdk ... -
PhantomReference
2017-11-19 12:13 529PhantomReference 一、总结 1.jdk 1 ... -
FinalReference
2017-11-19 10:11 491FinalReference 一、总结 1.jdk 1.8 ... -
SoftReference
2017-11-16 21:29 593SoftReference 一、总结 1.jdk 1.8. ... -
WeakReference
2017-11-13 21:18 720WeakReference 一、总结 1.jdk 1.8. ...
相关推荐
Java对象的强、软、弱和虚引用+ReferenceQueue Java对象的强、软、弱和虚引用是Java语言中的一种机制,用于控制对象的生命周期和垃圾回收。下面是对Java对象的强、软、弱和虚引用的详细解释: 一、强引用(Strong...
SoftReference<String> softRef = new SoftReference(new String("hello"), referenceQueue); ``` 3. **弱引用**: - 弱引用的对象比软引用的对象有更短的生命周期。一旦垃圾回收器开始工作,无论内存是否紧张,...
ReferenceQueue<Bitmap> queue = new ReferenceQueue(); SoftReference<Bitmap> softRef = new SoftReference(bitmap, queue); // 检查引用队列 if (queue.poll() != null) { // 执行清理操作 } ``` 以上就是关于...
ReferenceQueue<String> rq = new ReferenceQueue(); //创建弱引用 WeakReference<String> wr = new WeakReference(str, rq); ``` 在这个示例中,我们创建了一个强引用指向一个字符串对象,然后创建了一个引用队列...
ReferenceQueue<String> queue = new ReferenceQueue(); SoftReference<String> softRef = new SoftReference(str, queue); if (queue.poll() == null) { System.out.println("soft reference is still valid."); ...
ReferenceQueue<String> rq = new ReferenceQueue(); // 创建引用队列 WeakReference<String> wf = new WeakReference(str, rq); // 创建弱引用,弱引用"hello"对象并关联引用队列 ``` 在这个例子中,`str`是一个强...
ReferenceQueue<String> queue = new ReferenceQueue(); PhantomReference<String> phantomReference = new PhantomReference(str, queue); str = null; // 断开强引用 System.gc(); // 请求GC // GC执行后,...
- 示例:`PhantomReference<String> phantomRef = new PhantomReference(new String("PhantomReference Test"), new ReferenceQueue());` 理解这四种引用类型有助于开发者在设计和实现复杂系统时,更好地控制对象...
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。 弱引用(WeakReference)弱引用与软引用的区别在于:只...
ReferenceQueue<Bean> queue = new ReferenceQueue(); PhantomReference<Bean> phantom = new PhantomReference(new Bean("name", 10), queue); System.gc(); // 强制执行垃圾回收 System.out.println(phantom.get()...
线程池调用队列是多线程编程中一个重要的概念,它在处理并发任务时起着关键作用。线程池是一种高效的线程管理机制,它通过预先创建一定数量的线程来处理任务,而不是每次需要执行任务时都创建新线程。...
无论是弱引用、软引用还是虚引用,都可以配合`ReferenceQueue`来监控引用对象的回收情况。当引用的对象被垃圾回收时,引用对象会进入队列,以便程序员可以及时处理。 5. 设计模式改进: 在设计代码时,避免直接在...
通过调用ReferenceQueue的poll()方法,开发者可以获取并移除前面添加的Reference对象。 三、Apk大小压缩方法 Android应用打包成APK文件时,其中包含了应用的代码、资源和清单文件。主要包含以下目录: - META-INF...
- 示例:`PhantomReference<String> phantomRef = new PhantomReference(new String("Hello"), new ReferenceQueue());` 这些引用类型的使用需要根据具体需求来选择。例如,软引用常用于缓存策略,以保持一定数量...
虚引用的主要用途是配合引用队列(ReferenceQueue),在对象被回收后进行一些后续清理工作。 `Reference`类的使用通常涉及以下几个步骤: 1. 创建引用子类的实例,如`SoftReference`, `WeakReference`, 或 `...
* 虚引用:是一种形同虚设的引用,必须和引用队列(ReferenceQueue)联合使用 GC Roots * GC Roots 是一组必须活跃的引用 * 包括:Java 线程中当前所有正在被调用的方法的引用类型参数、局部变量、临时值等 * GC ...
ReferenceQueue<String> queue = new ReferenceQueue(); PhantomReference<String> phantomRef = new PhantomReference(str, queue); // 检查对象是否已被垃圾回收 Reference<? extends String> refInQueue = queue...
弱引用通常不直接使用,而是配合引用队列(ReferenceQueue)使用,以便于监听对象的回收。 4. **虚引用**:不直接影响对象的生命周期,主要用于跟踪对象被回收的情况。虚引用必须与引用队列一起使用,当对象将被...
2. **运行机制**:`LeakCanary`通过实现`ReferenceQueue`来监控已释放的引用。当检测到潜在的内存泄漏时,它会创建一个`HeapDump`,然后使用`HeapAnalyzer`分析堆转储文件,寻找可能的泄漏引用链。 3. **分析结果**...