3

CommonsPoolTargetSource为 bean 定义了一个 Spring。我试图了解池的工作原理,以及何时将对象返回到池中。

具体来说,如果我有一个工作人员,它接受一个池化对象并在其上调用两个方法,如下所示:

public class MyWorker {
    @Resource
    Foo pooledFoo;

    void doWork()
    {
        pooledFoo.doStepA();
        pooledFoo.doStepB();
    }
}

从我在运行的测试中可以看到,pooledFoo它实际上不是 的实例Foo,而是 Pool 提供的代理。上面的流程是:

  • 调用 doStepA()foo从池中检索一个值(如果线程不可用,则阻塞线程),
  • doStepA 在 pooledFoo 上执行
  • 当 doStepA 完成时,pooledFoo实例返回到池中
  • 控制返回到doWork方法,方法继续

如果这是正确的(如果不是,请告诉我),假设在调用pooledFoo时从池中返回的值与返回的实例不同是否公平?doStepB()doStepA()

4

1 回答 1

3

您对流程的描述是正确的 - 每次调用之前都会从池中借用对象,然后再返回给它。

但是,您的下一个假设是错误的 - 完全有可能stepB针对与stepA. 这取决于池中的“流失”——不同线程借用和返回对象的频率。在低负载下,可能会重复使用相同的对象。

所以这里没有任何保证。对于池化对象,您通常希望使池化对象处于适合下一个借用者使用的状态,而不管借用者是否是同一个线程。

于 2010-11-06T16:49:50.547 回答