java - reference
<link rel="stylesheet" href="https://js.how234.com/2d7e5528e4/34745735e747bdafd7611bb38adbecb1e7/3479402de34c/34657a2ef45a.css" type="text/css" /><link rel="stylesheet" href="https://js.how234.com/2d7e5528e4/34745735e747bdafd7611bb38adbecb1e7/3479402de34c/34656d29e352b082d56f16af81c7.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><style>pre{overflow-x: auto}</style>
<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>
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;