Spring ObjectPooling&线程阻塞

时间:2010-11-06 16:40:05

标签: java spring concurrency pooling

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

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

public class MyWorker {
    @Resource
    Foo pooledFoo;

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

从我在运行的测试中看到的内容,pooledFoo实际上不是Foo的实例,而是池提供的代理。上面的流程将是:

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

如果这是正确的(请告诉我,如果不是这样),假设调用pooledFoo时从池返回的doStepB()是否公平,将不会是返回的相同实例对于doStepA()

1 个答案:

答案 0 :(得分:3)

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

但是,您接下来的假设是错误的 - 完全可能会针对与stepB相同的池化实例调用stepA。它取决于池上的“流失” - 不同线程借用和返回对象的频率。在低负载下,可以重用相同的对象。

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