• java四种引用与回调函数


    JAVA四种引用

    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);

    }

    }

  • 相关阅读:
    sql优化
    es和solr
    RabbitMQ 整理
    redis分布式缓存
    redis集群
    drf-jwt第三方插件,DRF的三大认证的具体使用,多方式登陆的实现
    自定义路由组件,Django的admin后台管理,DRF的三大认证,jwt认证
    DRF视图家族
    导包补充,深度查询(深度序列化),十大接口
    三流,内部类,基表,表关系,断开表关联,外键字段属性
  • 原文地址:https://www.cnblogs.com/chxwkx/p/11225873.html
Copyright © 2020-2023  润新知