我有一个为豆定义的Spring CommonsPoolTargetSource。我试图了解池的工作方式,以及当对象返回时池。

具体来说,如果我有一个工作程序,它需要一个合并的对象并对其调用两个方法,如下所示:

public class MyWorker {
    @Resource
    Foo pooledFoo;

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

从运行的测试中可以看到,pooledFoo实际上不是Foo的实例,而是Pool提供的代理。上面的流程为:
  • foo上调用doStepA()从池中检索一个值(如果一个线程不可用,则阻塞线程),
  • doStepA在pooledFoo上执行
  • 当doStepA完成时,pooledFoo实例返回到池中
  • 控件返回到doWork方法,该方法继续

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

    最佳答案

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

    但是,您的下一个假设是错误的-完全有可能对与stepB相同的池实例调用stepA。这取决于池上的“搅动”-不同线程借用和返回对象的频率。在低负载下,同一对象可能会被重用。

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

    09-26 18:52