Обновление Spring-зависимой зависимости одноэлементного компонента в поточно-ориентированном режиме - PullRequest
0 голосов
/ 18 мая 2018

У меня есть одноэлементный компонент, управляемый Spring, который требует обновить свою зависимость на основе определенного условия:

@Component
public class BeanClass {

    private DependencyClass dependency;

    public void beanMethod() {
        // if dependency is not initialised or otherwise requires renewal (becomes stale)
        if (condition) {
            dependency = renewDependency();
        }
        // use dependency
    }
}

Этот bean используется в многопоточной среде, и я хотел бы убедиться, что покаdependency обновляется в одном потоке (это может быть дорогостоящим процессом), ни один другой поток не может использовать dependency или снова ввести логику условия обновления.

Я понимаю, что у меня мало вариантов, я должен либо использовать некоторые из нихили несколько из них в комбинации:

  • добавить модификатор volatile к dependency.Насколько я понимаю, это всего лишь подсказка компилятору и не решает проблему самостоятельно?
  • wrap if (condition) с synchronized.Что я использую в качестве объекта блокировки?dependency само по себе, this или private final Object lock = new Object() поле класса?
  • извлекает if (condition) в метод и вместо него помещает synchronized.Это то же самое, что и опция synchronized(this), описанная выше?

Каков предпочтительный способ решения этой задачи?

Интересно, есть ли магия в контейнере IoC Spring, прокси,или что-нибудь, что могло бы упростить это для меня.

...