我有一个Spring托管单例bean,需要根据特定条件更新其依赖项:
@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
时(可能是一个昂贵的进程),其他线程无法使用{{1}或者再次输入更新条件逻辑。
据我所知,我有几个选择,我应该使用其中一些或少数几个组合使用:
dependency
修饰符添加到volatile
。我的理解这只是对编译器的一个暗示,并没有单独解决问题?dependency
包裹if (condition)
。我用什么作为锁定对象? synchronized
本身,dependency
或this
类字段?private final Object lock = new Object()
提取到方法中,然后将if (condition)
放在其上。它与上面的synchronized
选项相同吗?实现此任务的首选方法是什么?
我想知道Spring的IoC容器中是否有任何魔法,代理或任何可以简化此操作的内容。