对象池管理器
对象池管理器控制应用程序对象和开发工具箱 (Developer Kit) 对象的复用,如 Vectors 和 HashMaps。
可以在一个 Application Server 单元中创建多个对象池管理器。每个对象池管理器具有唯一的单元范围的 Java™ 命名和目录接口 (JNDI) 名称。应用程序可通过执行使用 JNDI 名称的 JNDI 查找来查找特定对象池管理器。
public interface ObjectPoolManager { ObjectPool getPool(Class aClass) throws InstantiationException, IllegalAccessException; ObjectPool createFastPool(Class aClass) throws InstantiationException, IllegalAccessException; } public interface ObjectPool { Object getObject(); void returnObject(Object o); }
getObject() 方法从对象池中移除对象。如果对 getObject() 进行了调用,而池为空,那么将创建同一种类型的对象。returnObject() 调用将对象放回至对象池。如果未调用 returnObject(),那么不再能够从对象池分配该对象。如果对象未返回至对象池,那么会将对象作为垃圾来回收。
- 此对象必须是具有公用缺省构造函数的公用类。
- 如果对象实现 java.util.Collection 接口,那么它必须支持可选的 clear() 方法。
每个共享对象类必须具有其自己的对象池。另外,应用程序使用 ObjectPoolManager.getPool() 方法或 ObjectPoolManager.createFastPool() 方法获取特定对象的对象池。这些方法的不同在于 getPool() 方法返回可跨多个线程共享的池。createFastPool() 方法返回只能由单个线程使用的池。
如果在 Java 虚拟机 (JVM) 中,为单个类多次调用 getPool() 方法,会返回相同的池。当调用 createFastPool() 方法时,为每次调用返回一个新的池。基本上,getPool() 方法返回线程同步的池。
由于需要处理线程同步,所以多个线程使用的池比快速池略微慢一点。但是,在使用快速池时要特别谨慎。
public interface PoolableObject { void init(); void returned(); }
如果放入此池的对象实现此接口,并调用 ObjectPool.getObject() 方法,那么此池分布的对象调用 init() 方法。当调用 ObjectPool.returnObject() 方法时,在对象返回对象池前,对其调用 PoolableObject.returned() 方法。使用此方法对象可预初始化或清除。
public class PooledArrayList extends ArrayList implements PoolableObject { public PooledArrayList() { } public void init() { } public void returned() { clear(); } }
如果应用程序使用此对象,代替为真的 ArrayList 对象,那么 ArrayList 对象在返回池时,自动清除。
清除 ArrayList 对象只须使它为空,但是不释放数组后备 ArrayList 对象。因此,当应用程序复用 ArrayList 时,后备数组不断扩展,直到它足够用于所有应用程序需求。当达到此点时,应用程序停止分配和复制新的后备数组,并实现最好的性能。
不可能或不期望使用先前的步骤。另一个可选方法是实现定制对象池,并使用对象池管理器作为用于此类型类的池来注册此池。当在单元中定义对象池管理器时,WebSphere® 管理员注册此类。注意,这些类打包在 Java 归档 (JAR) 文件中,此 JAR 文件在可能使用它们的单元中的所有节点上提供。