Spring ObjectPooling & блокировка потоков - PullRequest
3 голосов
/ 06 ноября 2010

У меня есть Spring CommonsPoolTargetSource, определенный для бобов. Я пытаюсь понять, как работает пул, и когда объект возвращается в пул.

В частности, если у меня есть работник, который берет объединенный объект и вызывает два метода для него, как показано ниже:

public class MyWorker {
    @Resource
    Foo pooledFoo;

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

Из того, что я вижу в тестах, которые я запускал, pooledFoo на самом деле не экземпляр Foo, а прокси, предоставляемый пулом. Поток в вышеупомянутом будет:

  • Вызов doStepA () для foo извлекает значение из пула (блокирует поток, если он недоступен),
  • doStepA выполняется на pooledFoo
  • после завершения doStepA экземпляр pooledFoo возвращается в пул
  • управление возвращается к методу doWork, и метод продолжается

Если это правильно (скажите, пожалуйста, если это не так), можно ли предположить, что pooledFoo, возвращенный из пула при вызове doStepB(), не будет тем же экземпляром, который был возвращен для doStepA()

1 Ответ

3 голосов
/ 06 ноября 2010

Ваше описание потока верно - объект будет заимствован из пула перед каждым вызовом, а затем возвращен ему.

Однако следующее ваше предположение неверно - вполне возможно, что stepB будет вызываться для того же объединенного экземпляра, что и stepA.Это зависит от "оттока" в пуле - как часто объекты заимствуют и возвращают разные потоки.При низкой нагрузке один и тот же объект может быть использован повторно.

Так что здесь нет никаких гарантий.Для объединенных объектов обычно требуется оставить объединенный объект в состоянии, в котором он пригоден для использования следующим заемщиком, независимо от того, является ли заемщик тем же потоком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...