開心生活站

位置:首頁 > IT科技 > 

java,reference

IT科技2.93W

<link rel="stylesheet" href="https://js.how234.com/559000b9bd/4c9a02a4bec20fc1fc2f0e60a2782b5ffb/4c9715bcbac9/4c8b2fbfaddf.css" type="text/css" /><link rel="stylesheet" href="https://js.how234.com/559000b9bd/4c9a02a4bec20fc1fc2f0e60a2782b5ffb/4c9715bcbac9/4c8b38b8bad702ecfe21037ca964.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。

java reference

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;

標籤:java reference