У меня есть одноэлементный компонент, управляемый 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, прокси,или что-нибудь, что могло бы упростить это для меня.