以线程安全的方式更新Spring托管的单例bean依赖

时间:2018-05-18 01:06:46

标签: java spring thread-safety inversion-of-control synchronized

我有一个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本身,dependencythis类字段?
  • private final Object lock = new Object()提取到方法中,然后将if (condition)放在其上。它与上面的synchronized选项相同吗?

实现此任务的首选方法是什么?

我想知道Spring的IoC容器中是否有任何魔法,代理或任何可以简化此操作的内容。

0 个答案:

没有答案