Java的四種引用原始碼例子

來源:互聯網
上載者:User

標籤:java   弱引用   軟引用   虛引用   

Java的四種引用原始碼例子

不解釋,直接上代碼,千言萬語頂不住一行代碼。

package com.apkkids.javalanguage;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.lang.reflect.Field;/** * @author wxb * Java的四種引用 * 強引用:擁有強引用的對象無論何時都不會被記憶體回收 * 軟引用:只擁有軟引用的對象當記憶體不足時,會被記憶體回收 * 弱引用:只擁有弱引用的對象會在垃圾收集運行時被回收 * 虛引用:只擁有虛引用的對象和沒有引用一樣,只不過它被記憶體回收時會被放入關聯的引用隊列,並可被觀察到 * */public class FourReferenceTest {    /**     * @param args     */    public static void main(String[] args) {        //三個測試,測試其中一個時請注釋掉其他兩個        PhatomReferenceTest();//      WeakReferenceTest();//      SoftReferenceTest();    }    static void PhatomReferenceTest(){        String s = new String("abc");        //建立一個引用隊列rq,然後用rq和s一起建立一個虛引用        final ReferenceQueue<String> rq = new ReferenceQueue<String>();        PhantomReference<String> wr = new PhantomReference<String>(s,rq);  //wr.get()會永遠返回null        s = null;        //建立一個線程來迴圈檢測s是否加入了隊列        new Thread(){            boolean bFlag = true;            @Override            public void run() {                Object obj = null;                while(bFlag){                    obj = rq.poll();  //rq中終會poll出一個PhantomReference                    if(obj != null){                        bFlag = false;                        try {                            //使用反射的原因是PhantomReference的get方法始終返回null                            //即使向上轉型為Reference也不行,因此只能通過反射直接得到儲存在Reference類中的referent                            Field f = Reference.class.getDeclaredField("referent");                            f.setAccessible(true);                            String s = (String) f.get(obj);                            System.out.println("get String from PhantomReference :"+s);                        } catch (NoSuchFieldException e) {                            e.printStackTrace();                        } catch (SecurityException e) {                            e.printStackTrace();                        } catch (IllegalArgumentException e) {                            e.printStackTrace();                        } catch (IllegalAccessException e) {                            e.printStackTrace();                        }                    }                }            }        }.start();        try {            //主線程休眠後運行gc,等待子線程運行            Thread.sleep(1000);            System.gc();            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }       }    static void WeakReferenceTest(){        String s = new String("abc");        WeakReference<String> wr = new WeakReference<String>(s);        s = null;        while(wr.get() != null){            System.out.println("WeakReference get :"+wr.get());            System.gc();            System.out.println("System.gc()");        }    }    /**     * 不到記憶體耗盡該測試不會退出     */    static void SoftReferenceTest(){        String s = new String("abc");        SoftReference<String> wr = new SoftReference<String>(s);        s = null;        while(wr.get() != null){            System.out.println("SoftReference get :"+wr.get());            System.gc();            System.out.println("System.gc()");        }    }}

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Java的四種引用原始碼例子

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.