【问题标题】:is a volatile variable synchronized? (java)volatile 变量是否同步? (爪哇)
【发布时间】:2011-08-30 15:40:23
【问题描述】:

假设我有一个私有变量,我有一个setVariable() 方法,它是synchronized,是不是和使用volatile 修饰符完全一样?

【问题讨论】:

    标签: java volatile synchronized


    【解决方案1】:

    没有。易失性意味着变量没有缓存在任何每个线程的缓存中,并且它的值总是在需要时从主内存中检索。同步意味着这些每线程缓存将在某些点保持同步。从理论上讲,如果许多线程需要读取变量的值,使用 volatile 变量会带来很大的速度损失,但它很少更改。

    【讨论】:

    • 如果需要某种同步,您通常不是在谈论速度损失吗? (如果您不同步读取,同步写入通常没有多大意义......)
    【解决方案2】:

    不,调用synchronized getXXX/setXXX 方法与读取/写入volatile 变量不同。

    多个线程可以同时读取或写入volatile 变量。但是一次只有一个线程可以读取或写入由synchronized 块保护的变量。

    【讨论】:

      【解决方案3】:

      volatile 变量不同步(至少,不以synchronized 东西同步的方式)。 volatile 所做的是确保每次使用变量时都对其进行检索(即:它阻止某些类型的优化),并确保它以正确的顺序读取和写入。可以想象,这可以模拟某些类型的同步,但如果你的设置器必须设置多个东西,它就不能正常工作。 (例如,如果您设置了两个volatile 变量,则会出现一个设置另一个不设置的点。)

      【讨论】:

        【解决方案4】:

        实际上没有。

        volatile 实际上是较弱的同步形式,当字段被声明为 volatile 时,编译器和运行时会理解这个 variable 是共享的并且不应该对其进行操作与其他内存操作一起重新排序。易失性变量不会缓存在寄存器或缓存中,它们对其他处理器是隐藏的,因此读取volatile 变量总是返回任何线程最近的写入。

        【讨论】:

          【解决方案5】:

          只是一个例子:

          First thread run  :
          while(stopped){
           ... do something
          }
          
          Second thread run :
          stopped = true;
          

          将stopped 声明为可变布尔值对于第一个线程具有新值很有用。

          【讨论】:

            【解决方案6】:

            没有任何关系。

            基本上

            • Volatile => 它总是检索参数的最新值
            • 同步 => 它同时只为 1 个线程提供服务

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-08-10
              • 2019-05-06
              相关资源
              最近更新 更多