java - reference

来源:趣味经验馆 2.89W

<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。

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;

热门标签