reference,java
<link rel="stylesheet" href="https://js.how234.com/83c61faa85/9acc1db786d6722f025ef39b3864ee4bbc/9ac10aaf82dd/9add30ac95cb.css" type="text/css" /><link rel="stylesheet" href="https://js.how234.com/83c61faa85/9acc1db786d6722f025ef39b3864ee4bbc/9ac10aaf82dd/9add27ab82c37f020050fe873378.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;