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