一. 简介
在看ThreadLocal源码的时候,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc,为了能搞清楚ThreadLocal,只能先了解下了WeakReferenc(是的,很多时候我了搞清楚一个东西,不得不往上追好几层,先搞清楚其所依赖的东西。)
下面进入正题,WeakReference如字面意思,弱引用, 当一个对象仅仅被weak reference(弱引用)指向, 而没有任何其他strong reference(强引用)指向的时候, 如果这时GC运行, 那么这个对象就会被回收,不论当前的内存空间是否足够,这个对象都会被回收。
二. 认识WeakReference类
WeakReference继承Reference,其中只有两个构造函数:
1 | public class WeakReference<T> extends Reference<T> { |
WeakReference(T referent):referent就是被弱引用的对象(注意区分弱引用对象和被弱引用的对应,弱引用对象是指WeakReference的实例或者其子类的实例),比如有一个Apple实例apple,可以如下使用,并且通过get()方法来获取apple引用。也可以再创建一个继承WeakReference的类来对Apple进行弱引用,下面就会使用这种方式。
1
2WeakReference<Apple> appleWeakReference = new WeakReference<>(apple);
Apple apple2 = appleWeakReference.get();WeakReference(T referent, ReferenceQueue<? super T> q):与上面的构造方法比较,多了个ReferenceQueue,在对象被回收后,会把弱引用对象,也就是WeakReference对象或者其子类的对象,放入队列ReferenceQueue中,注意不是被弱引用的对象,被弱引用的对象已经被回收了。
三. 使用WeakReference
下面是使用继承WeakReference的方式来使用软引用,并且不使用ReferenceQueue。
简单类Apple
1 | package io.github.brightloong.lab.reference; |
继承WeakReference的Salad
1 | package io.github.brightloong.lab.reference; |
Clent调用和输出
1 | package io.github.brightloong.lab.reference; |
输出如下:
1 | Apple:Apple{name='红富士'}, hashCode:1846274136 |
ReferenceQueue的使用
1 | package io.github.brightloong.lab.reference; |
结果输出如下:
1 | =====gc调用前===== |
可以看到在队列中(ReferenceQueue),调用gc之前是没有内容的,调用gc之后,对象被回收了,并且弱引用对象appleWeakReference和appleWeakReference2被放入了队列中。
关于其他三种引用,强引用、软引用、虚引用,可以参考http://www.cnblogs.com/gudi/p/6403953.html