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