源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

java设计模式之实现对象池模式示例分享

  • 时间:2021-06-19 18:23 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:java设计模式之实现对象池模式示例分享
ObjectPool抽象父类
[u]复制代码[/u] 代码如下:
import java.util.Iterator; import java.util.Vector; public abstract class ObjectPool<T> {    private Vector<T> locked, unlocked;   // locked是已占用的对象集合,unlocked是可用对象集合    public ObjectPool() {     locked = new Vector<T>();     unlocked = new Vector<T>();    }    // 创建对象    protected abstract T create();    // 验证对象有效性    public abstract boolean validate(T o);    // 使对象失效    public abstract void expire(T o);    // 检出:从对象池获取对象    public synchronized T checkOut() {     T t;     if (unlocked.size() > 0) {      Iterator<T> iter = unlocked.iterator();      while(iter.hasNext()) {       t = iter.next();       if(validate(t)) {   // 对象有效        unlocked.remove(t);        locked.add(t);        return t;       }       else {   // 对象已经失效        unlocked.remove(t);        expire(t);       }      }     }     // 对象池塘没有可用对象,创建新对象     t = create();     locked.add(t);     return (t);    }    // 检入:释放对象回对象池    public synchronized void checkIn(T t) {     locked.remove(t);     if(validate(t)) {   // 如果对象仍有效则放回可用对象集合中      unlocked.add(t);     }     else {   // 否则使对象失效      expire(t);     }    } }
JDBCConnectionPool子类
[u]复制代码[/u] 代码如下:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class JDBCConnectionPool extends ObjectPool<Connection> {  private String url, usr, pwd;  public JDBCConnectionPool(String driver, String url, String usr, String pwd) {   super();   // 加载对应的数据库驱动   try {    Class.forName(driver).newInstance();   }   catch(Exception e) {    e.printStackTrace();   }   this.url = url;   this.usr = usr;   this.pwd = pwd;  }  @Override  protected Connection create() {   try {    return DriverManager.getConnection(url, usr, pwd);   }   catch(SQLException e) {    e.printStackTrace();   }   return null;  }  @Override  public boolean validate(Connection o) {   try {    return o.isClosed();   }   catch(SQLException e) {    e.printStackTrace();   }   return false;  }  @Override  public void expire(Connection o) {   try {    o.close();   }   catch(SQLException e) {    e.printStackTrace();   }   finally {    o = null;   }  }  public static void main(String[] args) {   JDBCConnectionPool dbConnPool = new JDBCConnectionPool("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test", "root", "123");   // 获取数据库连接对象   Connection conn = dbConnPool.checkOut();   // 使用数据库连接对象   // ...   // 释放数据库连接对象   dbConnPool.checkIn(conn);  } }
[u]复制代码[/u] 代码如下:
class Pool {    private static final MAX_AVAILABLE = 100;    private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);    public Object getItem() throws InterruptedException {      available.acquire();      return getNextAvailableItem();    }    public void putItem(Object x) {      if (markAsUnused(x))        available.release();    }    // Not a particularly efficient data structure; just for demo    protected Object[] items = ... whatever kinds of items being managed    protected boolean[] used = new boolean[MAX_AVAILABLE];    protected synchronized Object getNextAvailableItem() {      for (int i = 0; i < MAX_AVAILABLE; ++i) {        if (!used[i]) {           used[i] = true;           return items[i];        }      }      return null; // not reached    }    protected synchronized boolean markAsUnused(Object item) {      for (int i = 0; i < MAX_AVAILABLE; ++i) {        if (item == items[i]) {           if (used[i]) {             used[i] = false;             return true;           } else             return false;        }      }      return false;    }  }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部