2010-11-06 127 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