Java 为什么Spring框架更喜欢互斥而不是volatile?

Java 为什么Spring框架更喜欢互斥而不是volatile?,java,spring,concurrency,mutex,volatile,Java,Spring,Concurrency,Mutex,Volatile,使用互斥体而不是volatile来实现读取一致性有什么必要的地方吗?或者这只是首选项/代码约定/等等的问题?乍一看,互斥并没有什么新东西,只是我们有更多的代码行。此外,我们可以在同步块内更改多个变量,但这不是示例中的问题-只更改了一个变量 另外,我知道什么是互斥和易失性,请避免在回答中解释JMM。没有真正的原因,所以可能只是一个约定(个人或项目的),但在版本4.1.6中它们是原子布尔 通常使用active值(get/set),但是有一个关闭的使用compareAndSet,没有真正的原因,所以可

使用互斥体而不是volatile来实现读取一致性有什么必要的地方吗?或者这只是首选项/代码约定/等等的问题?乍一看,互斥并没有什么新东西,只是我们有更多的代码行。此外,我们可以在同步块内更改多个变量,但这不是示例中的问题-只更改了一个变量


另外,我知道什么是互斥和易失性,请避免在回答中解释JMM。

没有真正的原因,所以可能只是一个约定(个人或项目的),但在版本4.1.6中它们是原子布尔


通常使用
active
值(
get/set
),但是有一个
关闭的
使用
compareAndSet
,没有真正的原因,所以可能只是一个约定(个人或项目),但在版本4.1.6中它们是
AtomicBooleans


active
值通常使用(
get/set
),但是有一个
关闭的
使用
compareAndSet
volatile
synchronized
不同
volatile
只考虑线程之间数据的可读性<代码>同步
在这种情况下也会阻止并发访问


另外,
volatile
关键字的使用/实现也没有完全或正确地实现,因此互斥锁的使用更安全,尤其是在从JDK 1.5开始或之前的Spring代码中。对于需要支持Java的较旧版本的框架中的代码来说仍然如此
volatile
synchronized
不同
volatile
只考虑线程之间数据的可读性<代码>同步
在这种情况下也会阻止并发访问


另外,
volatile
关键字的使用/实现也没有完全或正确地实现,因此互斥锁的使用更安全,尤其是在从JDK 1.5开始或之前的Spring代码中。对于旧版本的框架中需要支持Java的代码来说,这仍然是正确的,但是Java 1.5在2004年发布,spring 3.2在2013年发布。。所以重构它花了大约10年的时间?Spring3.x是为了升级Spring中的API而不是实际的内部结构,为什么要修复一些没有损坏的东西呢。但事实是,这些代码起源于spring的早期版本,因此没有原子或适当的volatile。因此,底线是:spring使用互斥,因为它是过去的遗产。是的。在4.x版本中,已经进行了一些清理,但是Java1.5是在2004年发布的,Spring3.2是在2013年发布的。。所以重构它花了大约10年的时间?Spring3.x是为了升级Spring中的API而不是实际的内部结构,为什么要修复一些没有损坏的东西呢。但事实是,这些代码起源于spring的早期版本,因此没有原子或适当的volatile。因此,底线是:spring使用互斥,因为它是过去的遗产。是的。在4.x行中,已经对其进行了一些清理。
public abstract class AbstractApplicationContext extends DefaultResourceLoader
        implements ConfigurableApplicationContext, DisposableBean {

   private boolean active = false;
   private final Object activeMonitor = new Object();

   public boolean isActive() {
      synchronized (this.activeMonitor) {
         return this.active;
      }
   }

   protected void cancelRefresh(BeansException ex) {
       synchronized (this.activeMonitor) {
          this.active = false;
       }
   }

   ...
}