我为bean定义了一个Spring CommonsPoolTargetSource
。我试图了解池的工作原理,以及何时返回池中的对象。
具体来说,如果我有一个worker,它接受一个池化对象并在其上调用两个方法,如下所示:
public class MyWorker {
@Resource
Foo pooledFoo;
void doWork()
{
pooledFoo.doStepA();
pooledFoo.doStepB();
}
}
从我在运行的测试中看到的内容,pooledFoo
实际上不是Foo
的实例,而是池提供的代理。上面的流程将是:
foo
上调用doStepA()从池中检索一个值(如果一个不可用则阻塞该线程),pooledFoo
实例将返回池doWork
方法,方法继续如果这是正确的(请告诉我,如果不是这样),假设调用pooledFoo
时从池返回的doStepB()
是否公平,将不会是返回的相同实例对于doStepA()
?
答案 0 :(得分:3)
您对流的描述是正确的 - 在每次调用之前,对象将从池中借用,然后返回给它。
但是,您接下来的假设是错误的 - 完全可能会针对与stepB
相同的池化实例调用stepA
。它取决于池上的“流失” - 不同线程借用和返回对象的频率。在低负载下,可以重用相同的对象。
所以这里没有任何保证。对于池化对象,您通常希望将池化对象保持在适合下一个借用者使用的状态,无论借用者是否是同一个线程。