2010-11-06 167 views
3

我有一个定义为bean的弹簧CommonsPoolTargetSource。我试图了解如何合并工作,以及何时将对象返回池中。Spring ObjectPooling&线程阻塞

特别是,如果我有一个工人,这需要一个池对象,并调用它的两种方法,如下所示:

public class MyWorker { 
    @Resource 
    Foo pooledFoo; 

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

从我可以在我运行测试看,pooledFoo不实际上是一个Foo的实例,但是由池提供的代理。在流量以上将是:

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

如果这是正确的(PL轻松地告诉我,如果它不是),是否公平地假设被调用时从池中返回pooledFoo,将不会是doStepA()返回的同一个实例?

回答

3

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

但是,您的下一个假设是错误的 - 完全可能的是stepB将针对与stepA相同的池实例进行调用。它取决于游泳池上的“流失” - 对象被不同线程借用和返回的频率。在低负载下,可能会重复使用同一个对象。

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

+1

谢谢 - 非常明确的答案。 – 2010-11-06 16:57:48