Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以线程安全的方式更新Spring管理的单例bean依赖项_Java_Spring_Thread Safety_Inversion Of Control_Synchronized - Fatal编程技术网

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

Java 以线程安全的方式更新Spring管理的单例bean依赖项,java,spring,thread-safety,inversion-of-control,synchronized,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 (c

我有一个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
时(可能是一个昂贵的过程),没有其他线程可以使用
dependency
或再次进入更新条件逻辑

我知道我有几个选择,我应该使用其中的一些,或者结合使用其中的一些:

  • 易失性
    修饰符添加到
    依赖项
    。我的理解是,这只是对编译器的一个提示,并不能单独解决问题
  • if(条件)
    synchronized
    打包。我使用什么作为锁定对象<代码>依赖项自身、
    私有最终对象锁=新对象()
    类字段
  • if(condition)
    提取到方法中,并将
    synchronized
    放在其上。它是否与上面的
    synchronized(此)
    选项相同
实现此任务的首选方法是什么


我想知道Spring的IoC容器、代理或任何东西中是否有任何魔法可以简化这一点。

当不更新依赖项时,是否允许多个线程同时使用它?是的,您绝对知道应用程序可以生成的最大线程数吗(或者线程池的大小)?@takanuva15这是一个高度动态的环境,不确定。这有什么关系?