Spring ObjectPooling & блокировка потоков

У меня весна 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 ответ

Решение

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

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

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

Другие вопросы по тегам