我正在尝试了解 Flyweight设计模式如何有效地用于创建共享对象池。出现的要求是由于基于Java EE Web的应用程序的性能改进核对表。
对于频繁使用的复杂对象,我考虑使用可循环使用的对象池,而不是总是实例化新对象。
现在请告诉我如何使用flyweight设计模式来创建有价值的系统资源池 - 线程 - 数据库连接 - 套接字连接等。
答案 0 :(得分:3)
对于资源池,您需要:
aquire-release部分可以使用Semaphore
实现,其中池大小是信号量上的许可数。如果你关注the link to the JavaDoc,那么已经有了这样一个池的例子:
(来自JavaDoc的代码)
class Pool {
private static final int 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;
}
}