幽灵引用是android中最不会使用的引用,其作为finalize的替代方案,可以避免finalize的timeout。但是有时候并不是很好用,应为其发生在finalize之后,而这时候,这个对象已经不复存在。

这里的思想是,对象不能不存在,这个时候用另外一个对象去表示对这个对象的引用。

这样的话,对象就可以存在了,类似智能指针。

当然我们也可以用weakreference 做类似的事情,weakreference最大的问题是,weakreference.get()返回null的时候, 不一定 finalize()已经被调用,这个顺序很难确定。当然我们其实也不关心这个,只要我们能够收到finalize()或者将要finalize()的事件就可以了。

package sort;import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.util.ArrayList;
import java.util.List;import sort.Refer.ReferInfo;public class Refer<T extends Releasable> {
private static ReferenceQueue<Refer<? extends Releasable>> queue = new ReferenceQueue<>();public static class ReferInfo<T extends Releasable> {private T t;private PhantomReference<Refer<? extends Releasable>> phantomRef = null;}private T t;private static List<ReferInfo<Releasable>> mInfos = new ArrayList<>();static {start();}public static void start() {new Thread(new Runnable() {public void run() {while (true) {synchronized (mInfos) {queued = key.queue.remove(Integer.Max);if (queued  != null) {for (ReferInfo<?> key : mInfos) {//TODO:if(key.phantomRef == queued){System.out.println("enqueued!");key.t.release();}mInfos.remove(key);break;}}}try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.gc();}}}).start();}public Refer(T t) {this.t = t;ReferInfo<Releasable> info = new ReferInfo<>();info.phantomRef = new PhantomReference<>(this, queue);info.t = t;synchronized (mInfos) {mInfos.add(info);}}@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("finalize");}
}

下面是一个releasable

package sort;public interface Releasable {void release();
}

下面是一个使用方法:

package sort;import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;public class PhantomreferenceStudy implements Releasable {public static void main(String[] args) throws InterruptedException {System.out.println(".....");Refer refer = new Refer(new PhantomreferenceStudy());refer = null;while (true) {System.gc();}}@Overridepublic void release() {//在这里做一些清理的工作。而不是finalize, 这个方法发生在finalize之前。}
}

打印:

.....
finalize
enqueued!

完毕

Android面试题目之(9) 幽灵引用相关推荐

  1. 一个BAT大厂面试者整理的Android面试题目!

    身边好多朋友都裸辞了,出去旅游了一圈之后,回来才发现,工作并没有想象中那么好找.朋友小A一心只想进大厂面试Android,于是面试了阿里巴巴.美团.滴滴等,最后在某个大厂经历了5轮面试后拿到了offe ...

  2. 应该是史上最全最新Java和Android面试题目(自己总结和收集的)

    Android面试题目 Java 基础 int占用几个字节 讲一下常见编码方式? UTF-8编码下中文占几个字节 int和Interger的区别 int.char.long各占多少字节数 string ...

  3. 某通信公司的Android面试题目

    某通信公司的Android面试题目 今天的面试感觉做的不是很好,有些知识点明显没有掌握好,现在抽空把面试题目抄下来,同时努力掌握好对应的知识点. stack和heap有什么区别? heap是堆,sta ...

  4. Android面试题目(1-2-3--7)

    网上收集的Android 题目一 1.Activity生命周期说下,出现异常主要在那个阶段处理? 2.数据存储有哪几种方式?说过你用过哪些,做了哪些相关的项目?Sqlite用过说下? 3.Adapte ...

  5. android面试题目

    最近才开的博客,希望大家多多关注,andorid开发也做了3年有余了,也面试多家企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助.学完& ...

  6. 最新BAT大厂面试者整理的Android面试题目模板,成功入职字节跳动

    前言 **一年中第一段跳槽高潮就要来了,**看到同事一个个离职,又有一部分同事已经找到满意的工作,于是自己也盲目的开始面试起来(期间也没有准备充分),日夜奔走,简历投了很多家公司,然后就是一连串的面试 ...

  7. 最新BAT大厂面试者整理的Android面试题目模板,分享PDF高清版

    前言 从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求就行!所 ...

  8. Android面试题目及其答案

    第一篇 1.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalv ...

  9. 2022最新Android面试题目解答,Android MVP模式详解

    开头 Android开发,假如开始没有任何的开发经验的话, 千万不要着急,不要想着在短时间内就把一个语言学习好, 因为你之前没有任何的学习经验, 在这个过程中需要有耐心地学习完JAVA的基础知识, 然 ...

最新文章

  1. Linux访问Windows磁盘实现共享
  2. bash之逻辑控制---for语句
  3. Qt 原理-MOC(1)Meta Object Compiler
  4. UVA 10564 计数DP
  5. PHP使用GD库封装验证码类
  6. jquery模糊查询
  7. 爬虫,关于 video 标签 src 带有blob:http的 一些想法
  8. apmserver导入MySQL_mysql数据库导入导出
  9. 设置build.gradle打包时自动加时间
  10. 【项目管理】用LoC衡量程序员的工作效率是不科学的
  11. 【工具】sysbench 0.5 简介
  12. 集群-如何理解集群?
  13. VB移动没有标题的窗体
  14. [渗透测试] DOS攻击
  15. CentOS7.5下KVM虚拟机安装
  16. 安川g7接线端子图_安川G7变频器各接线端子功能说明
  17. tp6 thinkswoole 使用极光curl请求时报错
  18. ns-3中的数据跟踪与采集——Tracing系统的配置
  19. Win10打开文件夹闪退怎么解决
  20. 离线安装tensorboardx_pytorch安装

热门文章

  1. html中<pre>标签
  2. java 集合快速排序_搞定Java快速排序
  3. honey select 模型导出_道路建模-基本模型
  4. vscode安装本地服务器_如何用本地的VSCode连接极链AI的GPU服务器
  5. 添加javascript代码:_JavaScript的使用
  6. js获取当前日期_vue项目中获取前后N天日期
  7. zookeeper3.4集群搭建
  8. 防火墙 之 iptables 匹配条件讲解
  9. 电子商务企业借力呼叫中心提高效率
  10. Codeforces Round #383 (Div. 1) C(二分图)