java设计模式之实现对象池模式示例分享
java设计模式之实现对象池模式示例分享
发布时间:2016-12-28 来源:查字典编辑
摘要:ObjectPool抽象父类复制代码代码如下:importjava.util.Iterator;importjava.util.Vector...

ObjectPool抽象父类

复制代码 代码如下:

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子类

复制代码 代码如下:

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);

}

}

复制代码 代码如下:

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;

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Java学习
热门Java学习
编程开发子分类