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

}

}

java四种引用与回调函数的更多相关文章

  1. Java四种引用包括强引用,软引用,弱引用,虚引用。

    Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...

  2. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)

    Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...

  3. 不可访问内存 Java四种引用包括强引用,软引用,弱引用,虚引用

    小结: 1.不可访问内存是指一组没有任何可访问指针指向的由计算机程序进行动态分配的内存块. 2.垃圾收集器能决定是否一个对象还是可访问的:任何被确定不可访问的对象将会被释放. https://zh.w ...

  4. java四种引用及在LeakCanery中应用

    java 四种引用 Java4种引用的级别由高到低依次为: StrongReference > SoftReference > WeakReference > PhantomRefe ...

  5. JAVA四种引用方式

    JAVA四种引用方式: java.lang.ref: 强引用(直接变量赋值) 软引用(SoftReference): 只有在要发生OOM错误之前才会回收掉老的软引用对象,应用场景主要防止内存溢出.(缓 ...

  6. Java四种引用

    Java中提供了一个Reference抽象类,此类定义所有引用对象共有的操作,与垃圾收集器密切配合实现的.主要是为了决定某些对象的生命周期,有利于JVM进行垃圾回收.而继承此类的有四种引用,分别是St ...

  7. C++使用模板、函数指针、接口和lambda表达式这四种方法做回调函数的区别比较

    在C++中,两个类之间存在一种关系,某个类需要另外一个类去完成某一个功能,完成了之后需要告知该类结果,这种最普通最常见的需求,往往使用回调函数来解决. 如题,我总结下来有这么四种方式可以完成这项功能, ...

  8. 【转】JAVA四种引用(强引用,弱引用,软引用,虚引用)

    转自:http://www.cnblogs.com/gudi/p/6403953.html 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器 ...

  9. Java 四种引用介绍及使用场景

    强引用-FinalReference 介绍: 强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式: String str = new String("s ...

随机推荐

  1. netif_rx解析

    netif_rx函数是在网上收到数据包后,通过中断机制通知CPU而间接调用的中断处理例程. 首先,会将Packet传给netpoll框架,该框架用于在网络协议栈不可用的情况下,也能够提供给内核一个收发 ...

  2. HDU 6651 Final Exam (思维)

    2019 杭电多校 7 1006 题目链接:HDU 6651 比赛链接:2019 Multi-University Training Contest 7 Problem Description Fin ...

  3. 解决 html5 input type='number' 类型可以输入e

    当给 input 设置类型为 number 时,比如,我想限制,只能输入 0-9 的正整数,正则表达式如下: /^[-]?$/ // 匹配 0-9 的整数且只匹配 0 次或 1 次 用正则测试,小数点 ...

  4. erlang在windows下和虚拟机节点通信

    版权声明:博客将逐步迁移到 http://cwqqq.com https://blog.csdn.net/cwqcwk1/article/details/24738599 在Linux下部署erlan ...

  5. String,StringBuffer,StringBuilder

    String是字符串常量:StringBuffer,StringBuilder是字符串变量 StringBuffer是线程安全的且效率低:StringBuilder是线程不安全的故效率高 操作少量字符 ...

  6. mysql的sql筛选排重最大值并修改其属性

    修改属性 mysql -h192.168.1.51 -uroot -e "use codex_game_s1051_h; update user_info set isActive=0 wh ...

  7. docker启动elasticsearch异常Failed to create node environment(解决)

    异常说是创建节点环境失败,操作/usr/share/elasticsearch/data/nodes的IO错误,尝试给此目录添加读写权限后,依旧没什么**用,灵机一动是不是挂载目录没有权限导致的? c ...

  8. 41. wait notify 方法

    wait()  等待,如果一个线程执行了wait方法,那么该线程就会进去一个以锁对象为标识符的线程池中等待 notity() 唤醒,如果一个线程执行了notity方法,那么就会唤醒以锁对象为标识符的线 ...

  9. leetcode-三角形的最大周长

    Python解法: class Solution: def largestPerimeter(self, A: List[int]) -> int: A.sort() for i in rang ...

  10. leetcood学习笔记-167-两数之和 II - 输入有序数组

    题目描述: 第一次提交: class Solution(object): def twoSum(self, numbers, target): """ :type num ...