java

位置:IT落伍者 >> java >> 浏览文章

JAVA中的测不准原理


发布日期:2021年09月02日
 
JAVA中的测不准原理

测不准原理

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

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

javalangrefWeakReference

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

WeakReference wr = new WeakReference(obj);

if (wrget()==null) {

Systemoutprintln(obj 已经被清除了 );

} else {

Systemoutprintln(obj 尚未被清除其信息是 +objtoString());

}

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

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

javalangrefSoftReference

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

javalangrefPhantomReference

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有限电视终端应用:Java TVJava TV MHP

下一篇:Java新学法之Robocode基本原理之坐标锁定(下)