当前位置:酷酷问答>生活百科>WeakReference使用教程

WeakReference使用教程

2024-09-12 10:05:50 编辑:zane 浏览量:516

WeakReference使用教程

的有关信息介绍如下:

WeakReference使用教程

WeakReference是弱引用,弱引用持有的对象实例是可以被垃圾回收器回收的。通常用于保存保存对象的引用,却又不会影响对象被GC回收。对于DEBUG和内存监视工具非常有用。一般也常与队列联合使用。下面简单的介绍下如何使用WeakReference

使用说明还是从测试例子开始说明,首先添加一个TestWeakReference测试例子

/**

* 测试弱引用

* Created by shaowei on 2017/8/14.

*/

public class TestWeakReferece {

public static void main(String[] args) {

Object o = new Object();

WeakReference weak = new WeakReference(o);

o = null;

int i = 0;

while (weak.get() != null) {

i++;

System.out.println("Object is not null. count is " + i);

if (i % 10 == 0) {

System.gc();

System.out.println("System.gc() was called!");

}

try {

Thread.sleep(500);

} catch (InterruptedException e) {

}

}

System.out.println("object o was cleared by JVM!");

}

}

运行测试代码,打印结果如下,从结果中可以看出,循环打印了10次weak.get()都不为空,在第十次调用了System.gc(),之后weak.get()显示为空,则说明被gc回收了

从示例代码中可以看出,WeakReference对象一直持有o对象,就是因为WeakReference类是弱引用持有o对象,才没有影响到垃圾回收器对o对象的回收。

我们后续使用WeakReference时,就如图本例测试代码一样去构造WeakReference对象然后持有我们需要弱引用控制的类

WeakReference使用方法非常简单,主要是对WeakReference这个类的理解以及对java内存垃圾回收机制的理解,才能在适当的场景正确的使用弱引用。为了加深对WeakReference的理解,下面说明下jdk自身对WeakReference的使用的例子,就是ThreadLocal类,相信很多人都了解ThreadLocal类的作用,但也许还不知道ThreadLocal与WeakReference的关系,ThreadLocal有个静态内部类ThreadLocalMap

ThreadLocalMap类构造器里创建了Entry集合来存放以ThreadLocal为key的一个value值

这个Entry对象则是继承了WeakReference类,也就是说Entry集合存放的key对象是弱引用关系

这个地方用到弱引用,即ThreadLocal对象回收不会被这里的Entry所影响

版权声明:文章由 酷酷问答 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.kukuwd.com/life/32345.html