java reference

作者:原创时间:2022-04-16
文档

   

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;

以上就是小编今天的分享了,希望可以帮助到大家。

显示全文
java reflect java regex java openssl java orm java outer java outofmemory java overload java resources java resolve java require java region java render java override java pandas java parse java repeat java parser java request java partial java requests java redirect java rectangle java openjdk java opengl java openfire java onvif java inputstreamreader java influxdb java implements java image java htmlunit java hibernate java number java nslookup java notify java node类 java hdfs java hashcode java getbytes java geotools