“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);

程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

 
测试代码如下:
  

public class App
{
public static void main( String[] args ) throws InterruptedException
{
Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference<Object> pf = new PhantomReference<Object>(obj, queue);
obj=null; while(true){
System.out.printf("pf.get() = %d, isEnqueued: %b\r\n", pf.get(), pf.isEnqueued());
if(pf.isEnqueued())
break;
System.gc();
Thread.sleep(1000);
}
}
}
 
输出结果:
  1. pf.get()= null, isEnqueued: false
  2. pf.get()= null, isEnqueued: true
 

最新文章

  1. MySQL索引背后的数据结构及算法原理【转】
  2. 有问题得就分享(此实现不是 Windows 平台 FIPS 验证的加密算法的一部分)
  3. Fiddler使用AutoResponder进行本地文件和线上文件的映射
  4. BuildingAssetBundles in 5.x
  5. ACM 寻找最大数
  6. kernel/Makefile
  7. -webkit-appearance: none;去处select默认小箭头样式
  8. UIControl-IOS开发
  9. java总结
  10. Cocos2d-x 3.2 大富翁游戏项目开发-第七部分 获取角色路径_1
  11. scp免密码传送文件
  12. Android-Async-Http 特性简单分析
  13. ThinkPHP删除栏目(单)
  14. js制作列表滚动(有滚动条)
  15. python 函数运算先于单目运算
  16. Uploadify导致Chrome频繁崩溃Crash
  17. 算法(第4版) (Robert Sedgewick / Kevin Wayne 著)
  18. POJ:3083 Children of the Candy Corn(bfs+dfs)
  19. JQuery返回Json日期格式的問題
  20. poj1077

热门文章

  1. mysql创建索引笔记
  2. Linux学习路线+资源
  3. android弹出对话框
  4. 使用 Python 在 Linux 上实现一键回归测试
  5. POJ 1151Atlantis 矩形面积并[线段树 离散化 扫描线]
  6. 【bfs】BZOJ1102- [POI2007]山峰和山谷Grz
  7. 两个或多个线程执行完成之后继续执行之后的步骤,CountDownLatch与CyclicBarrier
  8. STL中优先队列的使用
  9. FireDAC 下的 Sqlite [2] - 第一个例子
  10. Python 訪问 LinkedIn (API)