java的四种引用_在风雨中奔跑的博客-程序员宅基地

技术标签: JDK  


在java中引用分为4中,强引用(Strong Reference),弱引用(WeakReference),软引用(SoftReference),虚引用(PhantomReference)

1.强引用

        强引用是我们在编程过程中使用的最简单的引用,如代码String s=”abc”中变量s就是字符串对象”abc”     一个强引用。任何被强引用指向的对象都不能被垃圾回收器回收,这些对象都是在程序中需要的。

   2.弱引用

       一个对象只有弱引用指向它,垃圾回收器会立即回收该对象,这是一种急切回收方式。

3.软引用

       软引用指向这些对象,则只有在JVM需要内存时才回收这些对象。软引用可以很好的用来实现缓存。

       4.虚引用

       虚引用的对象可以在任何时候被垃圾回收器回收。

     Java4种引用的级别由高到低依次为:

强引用  >  软引用  >  弱引用  >  虚引用

通过图来看一下他们之间在垃圾回收时的区别:

    ReferenceQueue以及Reference结构分析

     

    ReferenceQueue源码分析

    1.构造方法

public class ReferenceQueue<T> {

    /**
     * Constructs a new reference-object queue.
     */
    public ReferenceQueue() { }
}
     2.内部类

private static class Null extends ReferenceQueue {
        boolean enqueue(Reference r) {
            return false;
        }
    }
static private class Lock { };
     3.部分方法

      

boolean enqueue(Reference<? extends T> r) { /* 只能引用类调用 */
        synchronized (r) {
            if (r.queue == ENQUEUED) return false;//添加状态,返回false
            synchronized (lock) {
                r.queue = ENQUEUED;//修改为添加状态
                r.next = (head == null) ? r : head;//采用的是头插法
                head = r;
                queueLength++;
                if (r instanceof FinalReference) {
                    sun.misc.VM.addFinalRefCount(1);
                }
                lock.notifyAll();//唤醒所有的线程
                return true;
            }
        }
    }

public Reference<? extends T> poll() {//弹出元素
        if (head == null)
            return null;
        synchronized (lock) {
            return reallyPoll();//必须获取锁
        }
    }
private Reference<? extends T> reallyPoll() {       /* 必须获取锁,可以看上面的方法 */
        if (head != null) {
            Reference<? extends T> r = head;
            head = (r.next == r) ? null : r.next;
            r.queue = NULL;
            r.next = r;
            queueLength--;
            if (r instanceof FinalReference) {
                sun.misc.VM.addFinalRefCount(-1);
            }
            return r;
        }
        return null;
    }


参考:

http://blog.csdn.net/mazhimazh/article/details/19752475

http://www.importnew.com/10866.html




       

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zxdfc/article/details/54981880

智能推荐

android制作闹钟,android闹钟的制作_weixin_39942492的博客-程序员宅基地

首先获取闹钟管理者AlarmManager,通过button中的方法setAlarmOne()实现:1.获取当前Calendar系统时间2.弹出时间对话框//3.确定好选择的时间TimePickerDialog,(TimePickerDialog时间选择器)//4.设置闹钟//5.当之间一到Intent实现跳转,将执行的响应(intent.setAction(“com.example.g15083...

视频流媒体平台EasyNVR更新版本后切换页面显示异常问题排查_EasyNVR的博客-程序员宅基地

继我们的国标GB28181流媒体服务器改版之后,RTSP协议视频流媒体平台EasyNVR的新版界面也在加紧研发了,不久也即将和大家见面了。我经常说研发通常是一个试错的过程,总会有些问题存在,然后解决这些问题,从而慢慢成为一个完整的流媒体解决平台。我们在更新新版EasyNVR的时候,也同样遇到了一些问题。本文我们就来讲一下在更新新版流媒体平台EasyNVR的时候,发现页面各模版之间切换页面会紊乱错位的问题。此处偶尔出现错位,但刷新之后就好了。在进行代码排查之后,我们发现是项目引入的组件库过

第4章    EPC编码_军神锌的博客-程序员宅基地_epc编码

第四章          EPC编码 1.EPC的目的是提供对物理世界对象的唯一标识。         唯一标识意味着:必须有足够的EPC编码满足物体标识的需要;         解决编码冲突。2.EPC编码是由标头、厂商识别代码(EPC管理者)、对象分类代码、序列号等数据字段组成的一组数字。3.EPC编码分为EPC-64 I型、II型、III型和EPC-96 I型等(其...

假设错误检测_sssdffa的博客-程序员宅基地

看到这里的潜在问题?程序员认为用户会输入一个值,0和长度之间的“你好,世界!“。如果用户输入一个负数,或大量的数组索引,索引会出界。在这种情况下,因为我们只是读值,程序会打印一个垃圾信。但在其他情况下,程序可能会损坏其他变量,堆栈,或崩溃。防御性编程是一种形式的程序设计,包括试图找出其中的假设可能被侵犯,并编写代码检测和处理任何违反这些假设使计划的反应,在可预见的方式时,这些行为会发生。

关联规则(频繁项集)——Apriori_坚持到底cw的博客-程序员宅基地

1.该问题最初是对“购物篮”提出来的,著名例子是“尿布与啤酒”。2.相关概念: 关联规则的支持度:Support(A,B)=包含A和B的事务数/事务总数 关联规则的置信度:Confidence(A,B)= 包含A和B的事务数/包含A事务数 频繁项集:项集的频率大于等于最小支持度。 强相关规则:同时满足最小支持度和最小置信度。3.关联规则挖掘的步骤: 生成频繁项集,然后生

gedit的安装及插件使用_rooklyn21的博客-程序员宅基地

安装或升级gedit$ apt-get install gedit安装gedit插件$ apt-get install gedit-plugins安装插件完毕,可以在gedit的选项--插件里看到安装的插件。Embedded terminal的字体和背景颜色怎么设置?编辑这个文件 /usr/lib/gedit/plugins/terminal.py

随便推点

Android从相册中获取图片以及路径_wangyaqian1212的博客-程序员宅基地_android 获取相册图片路径

首先是相册图片的获取: private final String IMAGE_TYPE = "image/*";private final int IMAGE_CODE = 0;   //这里的IMAGE_CODE是自己任意定义的 //使用intent调用系统提供的相册功能,使用startActivityForResult是为了获取用户选择的图片 

s2sh整合案例-学生信息管理系统(二)_修罗debug的博客-程序员宅基地

s2sh整合案例-学生信息管理系统(二) 继续我们的s2sh整合案例-学生信息管理系统,上一系列我们讲了项目的整体搭建需要的Jar包以及web.xml和spring、hibernate以及数据库的相关配置。这一讲主要用于介绍后端server层(包括dao和service层)的所有源代码。 下图是后端的包目录结构: 首先是model层的pageBean,Grade,...

centos firewalld 2_weixin_34307464的博客-程序员宅基地

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

python-遍历目录下所有文件和分析两个json文件_xu187的博客-程序员宅基地

#判断两个文件是否互为新旧两个版本def contrastTwoFile(oldSpcial_file_dir,newSpcial_file_dir): f_1 = file(oldSpcial_file_dir) s1 = json.load(f_1) f_2 = file(newSpcial_file_dir) s2 = json.load(f_2)

未标注目标语料是否均适合用于跨语言学习?『基于对抗判别器高效利用未标注语料的跨语言NER算法AdvPicker』_iofu728的博客-程序员宅基地

本文公式较多,建议转至博客阅读(再过几个小时今年的 ACL 就要来了,赶在 ddl 之前,简单介绍一下韦乐,我,千惠,Börje,Yi Guan 等人在 ACL21 上的这篇工作。AdvPicker: Effectively Leveraging Unlabeled Data via Adversarial Discriminator for Cross-Lingual NER (ACL-IJCNLP 2021)️Weile Chen, Huiqiang Jiang, Qianhui Wu, Bö

推荐文章

热门文章

相关标签