国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java對象池技術的原理及其實現

2019-11-18 11:02:04
字體:
來源:轉載
供稿:網友

  摘 要 本文在分析對象池技術基本原理的基礎上,給出了對象池技術的兩種實現方式。還指出了使用對象池技術時所應注重的問題。

  要害詞 對象池;對象池技術;java 對象;性能

  Java對象的生命周期分析

  Java對象的生命周期大致包括三個階段:對象的創建,對象的使用,對象的清除。因此,對象的生命周期長度可用如下的表達式表示:T = T1 + T2 +T3。其中T1表示對象的創建時間,T2表示對象的使用時間,而T3則表示其清除時間。由此,我們可以看出,只有T2是真正有效的時間,而T1、T3則是對象本身的開銷。下面再看看T1、T3在對象的整個生命周期中所占的比例。

  我們知道,Java對象是通過構造函數來創建的,在這一過程中,該構造函數鏈中的所有構造函數也都會被自動調用。另外,默認情況下,調用類的構造函數時,Java會把變量初始化成確定的值:所有的對象被設置成null,整數變量(byte、short、int、long)設置成0,float和double變量設置成0.0,邏輯值設置成false。所以用new要害字來新建一個對象的時間開銷是很大的,如表1所示。

  表1 一些操作所耗費時間的對照表

運算操作示例標準化時間 本地賦值i = n1.0 實例賦值this.i = n1.2 方法調用Funct()5.9 新建對象New Object() 980 新建數組New int[10] 3100
  從表1可以看出,新建一個對象需要980個單位的時間,是本地賦值時間的980倍,是方法調用時間的166倍,而若新建一個數組所花費的時間就更多了。

  再看清除對象的過程。我們知道,Java語言的一個優勢,就是Java程序員勿需再像C/C++程序員那樣,顯式地釋放對象,而由稱為垃圾收集器(Garbage Collector)的自動內存治理系統,定時或在內存凸現出不足時,自動回收垃圾對象所占的內存。凡事有利總也有弊,這雖然為Java程序設計者提供了極大的方便,但同時它也帶來了較大的性能開銷。這種開銷包括兩方面,首先是對象治理開銷,GC為了能夠正確釋放對象,它必須監控每一個對象的運行狀態,包括對象的申請、引用、被引用、賦值等。其次,在GC開始回收“垃圾”對象時,系統會暫停應用程序的執行,而獨自占用CPU。

  因此,假如要改善應用程序的性能,一方面應盡量減少創建新對象的次數;同時,還應盡量減少T1、T3的時間,而這些均可以通過對象池技術來實現。

  對象池技術的基本原理

  對象池技術基本原理的核心有兩點:緩存和共享,即對于那些被頻繁使用的對象,在使用完后,不立即將它們釋放,而是將它們緩存起來,以供后續的應用程序重復使用,從而減少創建對象和釋放對象的次數,進而改善應用程序的性能。事實上,由于對象池技術將對象限制在一定的數量,也有效地減少了應用程序內存上的開銷。

  實現一個對象池,一般會涉及到如下的類:

  1)對象池工廠(ObjectPoolFactory)類

  該類主要用于治理相同類型和設置的對象池(ObjectPool),它一般包含如下兩個方法:

  ·createPool:用于創建特定類型和設置的對象池;

  ·destroyPool:用于釋放指定的對象池;

  同時為保證ObjectPoolFactory的單一實例,可以采用Singleton設計模式,見下述getInstance方法的實現:

public static ObjectPoolFactory getInstance() {
 if (poolFactory == null) {
  poolFactory = new ObjectPoolFactory();
 }
 return poolFactory;
}
  2)參數對象(ParameterObject)類

  該類主要用于封裝所創建對象池的一些屬性參數,如池中可存放對象的數目的最大值(maxCount)、最小值(minCount)等。

  3)對象池(ObjectPool)類

  用于治理要被池化對象的借出和歸還,并通知PoolableObjectFactory完成相應的工作。它一般包含如下兩個方法:

   ·getObject:用于從池中借出對象;
   ·returnObject:將池化對象返回到池中,并通知所有處于等待狀態的線程;

  4)池化對象工廠(PoolableObjectFactory)類

  該類主要負責治理池化對象的生命周期,就簡單來說,一般包括對象的創建及銷毀。該類同ObjectPoolFactory一樣,也可將其實現為單實例。通用對象池的實現

  對象池的構造和治理可以按照多種方式實現。最靈活的方式是將池化對象的Class類型在對象池之外指定,即在ObjectPoolFactory類創建對象池時,動態指定該對象池所池化對象的Class類型,其實現代碼如下:

. . .
public ObjectPool createPool(ParameterObject paraObj,Class clsType) {
 return new ObjectPool(paraObj, clsType);
}
. . .
  其中,paraObj參數用于指定對象池的特征屬性,clsType參數則指定了該對象池所存放對象的類型。對象池(ObjectPool)創建以后,下面就是利用它來治理對象了,具體實現如下:

public class ObjectPool {
 PRivate ParameterObject paraObj;//該對象池的屬性參數對象
 private Class clsType;//該對象池中所存放對象的類型
 private int currentNum = 0; //該對象池當前已創建的對象數目
 private Object currentObj;//該對象池當前可以借出的對象
 private Vector pool;//用于存放對象的池
 public ObjectPool(ParameterObject paraObj, Class clsType) {
  this.paraObj = paraObj;
  this.clsType = clsType;
  pool = new Vector();
 }
 public Object getObject() {
  if (pool.size() <= paraObj.getMinCount()) {
   if (currentNum <= paraObj.getMaxCount()) {
    //假如當前池中無對象可用,而且已創建的對象數目小于所限制的最大值,就利用
    //PoolObjectFactory創建一個新的對象
    PoolableObjectFactory objFactory =PoolableObjectFactory.getInstance();
    currentObj = objFactory.create Object (clsType);
    currentNum++;
   } else {
    //假如當前池中無對象可用,而且所創建的對象數目已達到所限制的最大值,
    //就只能等待其它線程返回對象到池中
    synchronized (this) {
     try {
      wait();
     } catch (InterruptedException e) {
      System.out.println(e.getMessage());
      e.printStackTrace();
     }
     currentObj = pool.firstElement();
    }
   }
  } else {
   //假如當前池中有可用的對象,就直接從池中取出對象
   currentObj = pool.firstElement();
  }
  return currentObj;
}
  public void returnObject(Object obj) {
   // 確保對象具有正確的類型
   if (obj.isInstance(clsType)) {
    pool.addElement(obj);
    synchronized (this) {
     notifyAll();
    }
   } else {
    throw new IllegalArgumentException("該對象池不能存放指定的對象類型");
   }
  }
}
  從上述代碼可以看出,ObjectPool利用一個java.util.Vector作為可擴展的對象池,并通過它的構造函數來指定池化對象的Class類型及對象池的一些屬性。在有對象返回到對象池時,它將檢查對象的類型是否正確。當對象池里不再有可用對象時,它或者等待已被使用的池化對象返回池中,或者創建一個新的對象實例。不過,新對象實例的創建并不在ObjectPool類中,而是由PoolableObjectFactory類的createObject方法來完成的,具體實現如下:



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台湾省| 邳州市| 古丈县| 富锦市| 盐边县| 永和县| 宜宾市| 苍南县| 子长县| 景德镇市| 且末县| 长春市| 开平市| 垫江县| 荆州市| 江津市| 黔东| 穆棱市| 武陟县| 铜山县| 越西县| 临清市| 福清市| 璧山县| 普兰县| 镇赉县| 通州市| 项城市| 仁寿县| 新野县| 微山县| 滕州市| 睢宁县| 临潭县| 安岳县| 德化县| 桃源县| 龙口市| 穆棱市| 北票市| 凌海市|