熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

JAVA中的測不准原理

2013-11-15 11:43:47  來源: JSP教程 

  測不准原理
  
  想做一個物理實驗看看某物質的導電情形於是接上電壓並串聯上一個安培計來觀察電流但是你知道嗎? 安培計本身也帶有電阻造成你的實驗准確度受到影響諸如此類的問題在科學界很常見所以有了「測不准原理」之說 不只是物理測不准的現象在計算機上也有可能發生比方說你想寫一個觀察程序觀察 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
  
  
  
  
  
  
  

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19514.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.