? ?
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;
以上就是小編今天的分享了,希望可以幫助到大家。