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