thinking in java 之Reference类的使用

Posted WesTward

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thinking in java 之Reference类的使用相关的知识,希望对你有一定的参考价值。

Reference是java中的特殊引用类。描述的是特殊作用(主要是关于垃圾回收对象)的引用。

它有3个子类:

1.SoftReference;

2.WeakReference

3.PhantomReference

先看thinking in java 中的实例

package containers;

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.LinkedList;

//对引用的 描述与封装,Reference类

class VeryBig2{
    private static final int SIZE= 10000;
    private long[] la= new long[SIZE];
    private String ident;
    public VeryBig2(String id){
        ident= id;
    }
    @Override
    public String toString() {
        
        return ident;
    }
    protected void finalize(){
        System.out.println("Finalizing "+ ident);
    }
}

public class ReferencesTest {
    private static ReferenceQueue<VeryBig2> rq= 
            new ReferenceQueue<VeryBig2>();
    public static void checkQueue(){
        Reference<? extends VeryBig2> inq= rq.poll();
        if (inq != null) {
            System.out.println("In queue: "+ inq.get());
        }
    }
    
    public static void main(String[] args) {
        int size= 10;
        if (args.length> 0) {
            size= new Integer(args[0]);
        }
        LinkedList<SoftReference<VeryBig2>> sa= 
                new LinkedList<SoftReference<VeryBig2>>();
        for (int i = 0; i < size; i++) {
            sa.add(new SoftReference<VeryBig2>(new VeryBig2("Soft "+ i), rq));
            System.out.println("Just created: "+ sa.getLast());
            checkQueue();
        }
        
        LinkedList<WeakReference<VeryBig2>> wa= 
                new LinkedList<WeakReference<VeryBig2>>();
        for (int i = 0; i < size; i++) {
            wa.add(new WeakReference<VeryBig2>(new VeryBig2("Weak "+ i), rq));
            System.out.println("Just created: "+ wa.getLast());
            checkQueue();
        }
        
        SoftReference<VeryBig2> s= 
                new SoftReference<VeryBig2>(new VeryBig2("Soft"));
        WeakReference<VeryBig2> w= 
                new WeakReference<VeryBig2>(new VeryBig2("Weak"));
        System.gc();//对无引用的对象,执行垃圾回收操作。并且,调用回收对象的finalize方法
        
        LinkedList<PhantomReference<VeryBig2>> pa= 
                new LinkedList<PhantomReference<VeryBig2>>();
        for (int i = 0; i < size; i++) {
            pa.add(new PhantomReference<VeryBig2>(new VeryBig2("Phantom "+ i), rq));
            System.out.println("Just created: "+ pa.getLast());
            checkQueue();
        }
    }
}

output:

Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Finalizing Weak
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Just created: [email protected]
In queue: null
Finalizing Weak 9
Just created: [email protected]
In queue: null
Finalizing Weak 8
Finalizing Weak 7
Just created: [email protected]
In queue: null
Finalizing Weak 6
Finalizing Weak 5
Finalizing Weak 4
Finalizing Weak 3

从结果中,可以看出:

1.垃圾回收器回收优先级别:SoftReference< WeakReference < PhantomReference。

2.当运行垃圾回收方法System.gc时,会先调用目标对象的finalize方法。

3.

以上是关于thinking in java 之Reference类的使用的主要内容,如果未能解决你的问题,请参考以下文章

Thinking in java学习笔记之持有对象总结

Thinking in java学习笔记之多态

thinking in java 之Reference类的使用

Thinking in java学习笔记之set

thinking in java之Collections工具类的使用

Thinking in java学习笔记之map的应用