转摘自: http://www.cncode.com/article/article_11061_1.html

测不准原理
     想做一个物理实验,看看某物质的导电情形,于是接上电压,并串联上一个安培计来观察电流,但是你知道吗? 安培计本身也带有电阻,造成你的实验准确度受到影响。诸如此类的问题在科学界很常见,所以有了「测不准原理」之说。不只是物理,测不准的现象在计算机上也有可能发生。比方说,你想写一个观察程序,观察 CPU 在执行某程序之下的使用率, 但是你的观察程序本身也会占用一部份的 CPU 效能,造成测出来的数据不精确。

   再想象下面的情况:如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,所以你必须要用 一个 reference 记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零, 使得对象无法被清除。...... 又是「测不准」。

   java.lang.ref.WeakReference

   不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此 对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。请看下面的例子:

   ...

   WeakReference wr = new WeakReference(obj);

   ...

   if (wr.get()==null) {

   System.out.println("obj 已经被清除了 ");

   } else {

   System.out.println("obj
   尚未被清除,其信息是 "+obj.toString());

   }

   ...

   在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。

   这类的技巧,在设计 Optimizer 或 Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。

   java.lang.ref.SoftReference

   Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。SoftReference 是用来设计 object-cache 之用的。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得 Soft Reference 也适合拿来实作 pooling 的技巧。

   java.lang.ref.PhantomReference

   Phantom Reference 主要是用来取代对象的 finalize()。程序员利用 finalize() 来进行释放资源的同时,有可能不小心 让此对象再度拥有 Direct Reference。但是使用 Phantom Reference 则不会有此情形发生。和 Weak Reference 以 及 SoftReference 最大的不同是:Phantom Reference 一订要搭配着 ReferenceQueue 使用,因为 Phantom Reference 的 get() 传 出值一定是 null(以避免此对象不小心再度拥有 Direct Reference)。通常我们会设计一个 class 继承 PhantomReference,然 后 override 其 clear() 来定义释放资源等收尾的动作。当然,我宁可小心一点地使用 finalize(),也不愿意自找麻烦地使用 Phantom Reference。(中国程序员)

Java中的测不准原理相关推荐

  1. java如何对不齐,java中的测不准原理_java认证

    测不准原理 想做一个物理实验,看看某物质的导电情形,于是接上电压,并串联上一个安培计来观察电流,但是你知道吗? 安培计本身也带有电阻,造成你的实验准确度受到影响.诸如此类的问题在科学界很常见,所以有了 ...

  2. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  3. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  4. java中hashcode_浅谈Java中的Hash值

    1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...

  5. JAVA中获取当前系统时间

    JAVA中获取当前系统时间 转自:http://www.cnblogs.com/Matrix54/archive/2012/05/01/2478158.html 一. 获取当前系统时间和日期并格式化输 ...

  6. Java中的对象和包

    什么是对象 对象就是实际生活中的事物,可以说一切事物都是对象. 对象的三个特点 1  对象的行为:这个对象能做什么, 例如包子是用来吃的 2  对象的状态:对象保持的一种状态,例如这个包子是热的还是凉 ...

  7. java中标识符,关键字,数据类型

    什么是标识符? 在java语言中用来给一个类,变量或方法命名的符号 标识符的命名规则 标识符可以由字母.数字.下划线(_).美元符($)组成,但不能包含 @.%.空格等其它特殊字符,不能以数字开头. ...

  8. Java中byte与16进制字符串的互相转换

    https://www.cnblogs.com/qinwangchen/p/5418028.html * Convert byte[] to hex string.这里我们可以将byte转换成int, ...

  9. JAVA中priorityqueue详解

    Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...

最新文章

  1. Java 分页,两种方式的分页,即取即用的代码,不客气
  2. 思路+步骤+方法,三步教你如何快速构建用户画像?
  3. 352. Data Stream as Disjoint Intervals
  4. ConvertUtils.register的作用
  5. Parquet格式描述
  6. 找CTO杜仲:技术人别把股权(期权)弄成一张废纸(新书推荐)
  7. 127.0.0.1 zxt.php,恭喜您!序列号购买成功!
  8. php判断日期文章变红,DeDecms如何实现当天发表的文章日期以红色显示
  9. creator 静态属性_cocos creator 属性面板设置
  10. [vscode] convert tabs to spaces
  11. python初学入门——————输入输出语句
  12. 兼容性问题以及解决方案
  13. mysql大于等于号
  14. 分享:如何在线将两个PDF合并成一个
  15. 《阿里云周刊》第4期:开放共享,网商银行的运营探索及技术支撑
  16. 新彩虹世界密码系统是多少_希望最近的世界密码日是我们需要的最后一个
  17. 武侠末世(真香游戏V2.0)
  18. 第十三周 任务四
  19. 声音驱动提示不完整或已损坏 (代码 19)
  20. 阿兰·麦席森·图灵 介绍

热门文章

  1. 高情商的王维注解了低政商孟浩然的后半生
  2. android增加来电闪光灯功能吗,苹果/安卓手机闪光灯提醒功能:手机来电闪光灯提醒怎么设置?...
  3. [Python]《点燃我,温暖你》李峋同款爱心代码
  4. mysql 时间差统计
  5. 华硕k5555l拆解图解_华硕ZenBook UX501笔记本拆机全过程图解
  6. 【大咖有约】Facebook Inc软件工程师 董思颖
  7. 【Linux】set ff=unix
  8. REXROTH力士乐柱塞泵A10VSO100DRS/32R-VPB12N00
  9. 全程干货!人物设计是什么?如何设计出好看的人物?
  10. python算法工程师需要会写什么_算法工程师到底在干嘛