最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

舉例講解Java設(shè)計(jì)模式中的對(duì)象池模式編程

 更新時(shí)間:2016年02月02日 08:52:26   作者:lixiang0522  
這篇文章主要介紹了Java設(shè)計(jì)模式中的對(duì)象池模式編程示例分享,對(duì)象池模式經(jīng)常在多線程開(kāi)發(fā)時(shí)被用到,需要的朋友可以參考下

定義
一個(gè)對(duì)象池是一組已經(jīng)初始化過(guò)且可以使用的對(duì)象的集合,池的用戶可以從池子中取得對(duì)象,對(duì)其進(jìn)行操作處理,并在不需要時(shí)歸還給池子而非銷毀它。

若初始化、實(shí)例化的代價(jià)高,且有需求需要經(jīng)常實(shí)例化,但每次實(shí)例化的數(shù)量較少的情況下,使用對(duì)象池可以獲得顯著的效能提升。從池子中取得對(duì)象的時(shí)間是可預(yù)測(cè)的,但新建一個(gè)實(shí)例所需的時(shí)間是不確定。

實(shí)現(xiàn)

20162284749593.gif (464×232)

1. Reusable - 對(duì)象池中的對(duì)象,通常實(shí)例化代價(jià)比較高。
2. Client - 使用一個(gè)對(duì)象的實(shí)例。
3. ReusablePool - 管理對(duì)象的實(shí)例化,回收和銷毀。

單個(gè)實(shí)例中主要的思想
1.一個(gè)棧,這里用stack
2.初始化方法,容器開(kāi)啟的時(shí)候可以預(yù)先創(chuàng)建池
3.創(chuàng)建實(shí)例的方法
4.提供從池中獲得對(duì)象實(shí)例的方法
5.提供返回的方法,不返回后果很嚴(yán)重
6.控制請(qǐng)求等待時(shí)間的方法,過(guò)了一定的事件還沒(méi)獲得對(duì)象實(shí)例,就返回一個(gè)null指針

import java.util.Stack; 
 
@SuppressWarnings("unchecked") 
public class ObjectPool { 
 
  public ObjectPool() { 
  } 
 
  private PoolParam poolParam; 
 
  public void setPoolParam(PoolParam poolParam) { 
    this.poolParam = poolParam; 
  } 
 
  // 當(dāng)前總對(duì)象個(gè)數(shù) 
  private int currentNum = 0; 
 
  private Class clazz; 
 
  public void setClazz(Class clazz) { 
    this.clazz = clazz; 
  } 
 
  // 棧,用來(lái)存放對(duì)象,模擬一個(gè)池 
  private Stack stack; 
 
  public Stack getStack() { 
    return stack; 
  } 
 
  public void setStack(Stack stack) { 
    this.stack = stack; 
  } 
 
  // ................................................................. 
  // 等待超時(shí)的記數(shù)變量 
  private int timeWait = 0; 
 
  // ................................................................. 
 
  // 創(chuàng)建對(duì)象池 
  public void initalPool(PoolParam poolParam, Class clazz) { 
 
    this.setPoolParam(poolParam); 
    this.setClazz(clazz); 
 
    stack = new Stack(); 
 
    stack.clear(); 
 
    // System.out.println("obj..pool is initial..."); 
    // 生成配置最小對(duì)象數(shù),并壓入棧中 
    try { 
 
      for (int i = 0; i < poolParam.getMinObjectCount(); i++) { 
 
        // 根據(jù)poolParam初始化對(duì)象池 
        stack.push(clazz.newInstance()); 
      } 
 
    } catch (InstantiationException e) { 
      e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
    } 
 
  } 
 
  // 創(chuàng)建單個(gè)對(duì)象 
  private Object createObj(Class clazz) { 
 
    Object obj = null; 
    try { 
 
      obj = clazz.newInstance(); 
 
      // System.out.println("a new one..."); 
    } catch (InstantiationException e) { 
      e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
    } 
 
    return obj; 
  } 
 
  // 對(duì)象池提供的get方法 
  public Object getInstance(){ 
 
    // System.out.println(stack.size()); 
 
    Object object = null; 
 
    if (stack.size() == 0) { 
 
      // 如果當(dāng)前棧的長(zhǎng)度為0,并且總的對(duì)象數(shù)沒(méi)有超過(guò)定義最大數(shù) 
      if ((currentNum + poolParam.getMinObjectCount()) < poolParam 
          .getMaxObjectCount()) { 
 
        // 新創(chuàng)建一個(gè)對(duì)象 
        object = this.createObj(clazz); 
        // 對(duì)象數(shù)+1 
        currentNum++; 
 
      } else { 
 
        synchronized (this) { 
 
          try { 
            waitme(this); 
          } catch (Exception e) { 
            e.printStackTrace(); 
          } 
 
          // 獲得通知后檢測(cè)棧中是為空,并給出剛剛釋放的資源 
          if (!stack.empty()) { 
            object = stack.pop(); 
          } 
        } 
      } 
 
    } else if (stack.size() > 0) { 
 
      object = stack.pop(); 
 
      // System.out.println(stack.size()); 
    } 
 
    return object; 
  } 
 
  // 返回對(duì)象的方法 
  public void returnObj(Object obj) { 
 
    if (clazz.isInstance(obj)) { 
 
      stack.push(obj); 
 
      synchronized (this) { 
 
        notify(); 
      } 
    } else { 
      System.out.println("this object can not push to stack!"); 
    } 
 
  } 
 
  // 等待遞歸算法 
  private void waitme(ObjectPool pool) { 
 
    // 等待2s的技術(shù)控制 
    if (timeWait >= 2000) { 
      System.out.println("jump up this step.."); 
 
      timeWait = 0; 
      return; 
 
    } else { 
 
      try { 
 
        pool.wait(500); 
 
        // 等待計(jì)數(shù)累加。。 
        timeWait +=1000; 
 
        System.out.println("waiting time to free obj.."); 
 
        if (stack.empty()) { 
          System.out.println("agian...."); 
          waitme(pool); 
        } 
 
      } catch (InterruptedException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
 
} 

 
管理池類,這個(gè)不是很難,同步了就好

@SuppressWarnings("unchecked") 
public class ObjectPoolManage { 
 
  private ObjectPoolManage() { 
  } 
 
  private static ObjectPool pool; 
   
 
 
  // 實(shí)現(xiàn)一個(gè)單例的獲取方法....默認(rèn) 
  public static synchronized ObjectPool getCacheObject(Class clazz) { 
 
    if (null != pool) { 
      return pool; 
    } else { 
 
      createObjectPool(null, clazz); 
      return pool; 
    } 
 
  } 
 
  // 實(shí)現(xiàn)一個(gè)單例的獲取方法...自定義 
 
  public static synchronized ObjectPool getCacheObject(PoolParam p, Class clazz) { 
    if (null != pool) { 
      return pool; 
    } else { 
 
      createObjectPool(p, clazz); 
      return pool; 
    } 
 
  } 
 
  private static ObjectPool createObjectPool(PoolParam p, Class clazz) { 
 
    pool = new ObjectPool(); 
 
    if (null == p) { 
      pool.initalPool(new PoolParam(5,10), clazz); 
    } else { 
      pool.initalPool(p, clazz); 
    } 
 
    return pool; 
  } 
   
  private static Class getclazz(){ 
     
    Class clazz=null; 
     
    try { 
      clazz= Class.forName(ppp.getPropertyByName("objectPath")); 
    } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
    } 
     
    return clazz; 
  } 
} 


相關(guān)問(wèn)題和實(shí)現(xiàn)
1. 對(duì)象池中可以限制對(duì)象的個(gè)數(shù),當(dāng)超過(guò)限制時(shí),對(duì)象池需要返回異?;蛘呖罩?,以通知客戶。
2. 在多線程環(huán)境中,在checkout和checkin方法需要同步。
3. 定時(shí)清理過(guò)期的對(duì)象。

相關(guān)文章

  • 利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作

    利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作

    這篇文章主要介紹了利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • SpringBoot項(xiàng)目熱部署的實(shí)現(xiàn)

    SpringBoot項(xiàng)目熱部署的實(shí)現(xiàn)

    SpringBoot項(xiàng)目熱部署是一種讓開(kāi)發(fā)人員在修改代碼后無(wú)需重啟應(yīng)用即可看到更改效果的技術(shù),通過(guò)使用SpringBoot的DevTools等工具,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • java  HttpServletRequest和HttpServletResponse詳解

    java HttpServletRequest和HttpServletResponse詳解

    這篇文章主要介紹了java HttpServletRequest和HttpServletResponse詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • MyBatis-Plus Generator配置詳解

    MyBatis-Plus Generator配置詳解

    這篇文章主要介紹了MyBatis-Plus Generator配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Springboot?-?Fat?Jar示例詳解

    Springboot?-?Fat?Jar示例詳解

    這篇文章主要介紹了Springboot?-?Fat?Jar詳解,Spring?Boot內(nèi)嵌容器,通過(guò)java?-jar命令便可以直接啟動(dòng)應(yīng)用,今天帶著大家探索FAT?JAR啟動(dòng)的背后原理,需要的朋友可以參考下
    2023-02-02
  • java線程中斷?interrupt?和?LockSupport解析

    java線程中斷?interrupt?和?LockSupport解析

    這篇文章主要為大家介紹了java線程中斷?interrupt?和?LockSupport示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • javaweb中Http協(xié)議詳解

    javaweb中Http協(xié)議詳解

    HTTP是hypertext transfer protocol(超文本傳輸協(xié)議)的簡(jiǎn)寫(xiě),它是TCP/IP協(xié)議的一個(gè)應(yīng)用層協(xié)議,用于定義WEB瀏覽器與WEB服務(wù)器之間交換數(shù)據(jù)的過(guò)程。這篇文章主要為大家詳細(xì)介紹了javaweb中的Http協(xié)議,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 基于Java Tomcat和激活MyEclips的深入理解

    基于Java Tomcat和激活MyEclips的深入理解

    本篇文章是對(duì)Java中的Tomcat和激活MyEclips進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • HDFS中JAVA API的使用

    HDFS中JAVA API的使用

    HDFS是一個(gè)分布式文件系統(tǒng),既然是文件系統(tǒng),就可以對(duì)其文件進(jìn)行操作,比如說(shuō)新建文件、刪除文件、讀取文件內(nèi)容等操作。下面記錄一下使用JAVA API對(duì)HDFS中的文件進(jìn)行操作的過(guò)程
    2017-07-07
  • spring boot org.junit.jupiter.api不存在的解決

    spring boot org.junit.jupiter.api不存在的解決

    這篇文章主要介紹了spring boot org.junit.jupiter.api不存在的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

盘锦市| 遂昌县| 东台市| 富宁县| 麟游县| 天峨县| 嘉鱼县| 威信县| 黔南| 新巴尔虎左旗| 孟州市| 桃园县| 洛隆县| 黎平县| 蓬莱市| 建宁县| 资溪县| 达拉特旗| 策勒县| 南投县| 桃园县| 会理县| 固始县| 莱阳市| 喀什市| 商水县| 阿克苏市| 阿图什市| 丰顺县| 奉化市| 汉沽区| 龙州县| 广南县| 汽车| 全椒县| 鸡东县| 湘潭市| 茂名市| 千阳县| 青海省| 高淳县|