
Java reference是什么?让我们一起来了解一下吧!
Java Reference是java中的引用类,它的作用是用来给普通对象进行包装,从而在JVM在GC时,按照引用类型的不同,在回收时采用不同的逻辑。java主要有4种引用方式。它们分别是强引用StrongReference、软引用SoftReference、弱引用WeakReference和虚引用PhantomReference。

softreference引用示例:
ReferenceQueue referenceQueue = new ReferenceQueue<>();
SoftReference softReference = new SoftReference<>("abc", referenceQueue);
System.gc();
System.out.println(softReference.get());
Reference reference = referenceQueue.poll();
System.out.println(reference);PhantomReference引用示例:
public class PhantomReferenceTest {
public static void main(String[] args) {
ReferenceQueue rq = new ReferenceQueue<>();
PhantomReference reference = new PhantomReference<>(new String("cord"), rq);
System.out.println(reference.get());
System.gc();
System.runFinalization();
System.out.println(rq.poll() == reference);
}
}WeakReference引用示例:
public class WeakReferenceTest {
public static void main(String[] args) {
ReferenceQueue rq = new ReferenceQueue<>();
//这里必须用new String构建字符串,而不能直接传入字面常量字符串
Reference r = new WeakReference<>(new String("java"), rq);
Reference rf;
//一次System.gc()并不一定会回收A,所以要多试几次
while((rf=rq.poll()) == null) {
System.gc();
}
System.out.println(rf);
if (rf != null) {
//引用指向的对象已经被回收,存入引入队列的是弱引用本身,所以这里最终返回null
System.out.println(rf.get());
}
}
}下面是Reference中的几个关键属性:
//关联的对象的引用,根据引用类型不同gc针对性处理 private T referent; //引用注册的队列,如果有注册队列则回收引用会加入该队列 volatile ReferenceQueue queue; //上面引用队列referenceQueue中保存引用的链表 /* active: NULL //未加入队列前next指向null * pending: this * Enqueued: next reference in queue (or this if last) * Inactive: this */ Reference next; /* When active: 由gc管理的引用发现链表的下一个引用 * pending: pending链表中的下一个元素 * otherwise: NULL */ transient private Reference discovered; /* used by VM */ /* *等待入队列的引用链表,gc往该链表加引用对象,Reference-handler线程消费该链表。 * 它通过discovered连接它的元素 */ private static Reference pending = null;
以上就是小编今天的分享了,希望可以帮助到大家。
