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()");
        }
    }

}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值