zoukankan      html  css  js  c++  java
  • JAVA四种引用

    https://www.cnblogs.com/chxwkx/p/11225873.html

    java对象的引用包括:

    1. 强引用
    2. 软引用
    3. 弱引用
    4. 虚引用

    Java中提供这四种引用类型主要有两个目的:

      第一是可以让程序员通过代码的方式决定某些对象的生命周期;

      第二是有利于JVM进行垃圾回收。

    实际用例

    1.强引用

      是指创建一个对象并把这个对象赋给一个引用变量。

      比如

      Object object =new Object();

      String str ="哈哈哈";

      强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。

    2.软引用

      软引用的特点是,如果JVM内存空间充沛,垃圾回收器就不会回收软引用变量。

      在回收器对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之 后,get()方法将返回null。

      举个栗子:

      BinarySearch bs = new BinarySearch();//二分查找

      bs.find(test, 0, test.length - 1, 5);

      SoftReference<BinarySearch> ruanYinYong = new SoftReference<BinarySearch>(bs);

      bs = null;

      ruanYinYong.get().find(test, 0, test.length - 1, 5);//即便强引用已经为Null,但是软引用还可以继续用。

      如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。(弱引用也是如此)

    3.弱引用

      WeakReference<People>reference=new WeakReference<People>(new People("zhouqian",20));

      System.out.println(reference.get());

      System.gc();//通知垃圾回收器回收资源

      System.out.println(reference.get());

      第一个输出,第二个输出为null

    4.虚引用

      java中使用PhantomReference来表示虚引用。就像某个对象没有引用与之关联一样,若某个对象与虚引用关联,那么在任何时候都可能被JVM回收掉。虚引用不能单独使用,必须配合引用队列一起使用。

      当垃圾回收器发现对象与虚引用关联,就会在回收它之前,将这个虚引用加入到引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被回收,从而进行操作。

      ReferenceQueue<String> queue = new ReferenceQueue<>();

      PhantomReference<String> str = new PhantomReference<String>("chx", queue);

      System.out.println(str.get());

    5.软引用结合回调函数使用

    import java.lang.ref.SoftReference;

    public class CallBackMain {

    SoftReference<CallBackTest> ruanYinYong = new SoftReference<CallBackTest>(new CallBackTest());

    public static void main(String[] args) {

      new CallBackMain().startCallBack();

    }

    public void startCallBack() {

    System.out.println("我去做别的了");

    ruanYinYong.get().callBack();

    }

    }

    class CallBackTest {

    public static int b = 1;

    public void callBack() {

      System.out.println("我是回调函数" + b);

    }

    }

     
  • 相关阅读:
    POJ 1426 Find The Multiple(数论——中国同余定理)
    POJ 2253 Frogger(Dijkstra变形——最短路径最大权值)
    POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
    POJ 3278 Catch That Cow(模板——BFS)
    HDU 1071 The area
    HDU 1213 How Many Tables(模板——并查集)
    POJ 1611 The Suspects
    light oj 1214 Large Division
    POJ 1258 Agri-Net(Prim算法求解MST)
    POJ 2387 Til the Cows Come Home(模板——Dijkstra算法)
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/12876181.html
Copyright © 2011-2022 走看看