Java 不使用易失性同步

Java 不使用易失性同步,java,multithreading,synchronization,volatile,Java,Multithreading,Synchronization,Volatile,我了解synchronize和volatile的功能以及它们的使用位置。我刚刚学习了volatile,我很困惑什么时候可以在没有volatile的情况下使用synchronize。如果我同步一个对象,我需要阻止其他线程使用同一个对象,但在大多数情况下,我会这样做来编辑对象,如果是这样,我需要在我正在编辑的属性上使用volatile 下面的代码是关于竞争条件的,我想知道为什么我从未见过有人使用volatile on count变量: public synchronized void add(i

我了解synchronize和volatile的功能以及它们的使用位置。我刚刚学习了volatile,我很困惑什么时候可以在没有volatile的情况下使用synchronize。如果我同步一个对象,我需要阻止其他线程使用同一个对象,但在大多数情况下,我会这样做来编辑对象,如果是这样,我需要在我正在编辑的属性上使用volatile

下面的代码是关于竞争条件的,我想知道为什么我从未见过有人使用volatile on count变量:

  public synchronized void add(int value){
      this.count += value;
  }
不应该在这里吗


我只是想找出一种情况,在没有volatile的情况下可以使用synchronize,一段代码会有所帮助。

很明显,
volatile
不够强大,无法实现计数器,因为它不能保证原子性。但是,如果读取的数量远远超过修改的数量,则可以将内部锁定和可变变量结合起来,以降低公共代码路径上的成本。看看这个

public class Counter {
    @GuardedBy("this") private volatile int value;

    public int getValue() { return value; }

    public synchronized int increment() {
        return value++;
    }
}

代码使用synchronized来确保增量操作是原子的,并使用volatile来保证当前结果的可见性。如果更新不频繁,这种方法可能会表现得更好,因为读取路径上的开销只是
易失性的
读取,这通常比锁获取便宜。

同步应该不够,对吗?我想知道为什么没有人在他们的例子中使用它。我可以举一个没有volatile的单独同步的例子吗?我似乎找不到一个,因为每个编辑都应该是可见的。如果您
同步
它,则不再需要
volatile
。但这会很慢,因为它需要大量的锁获取。
synchronized
提供与
volatile
相同的可见性。所以它是不需要的。@MohammadKarmi@PeterLawrey感谢这些文档,但我有一个疑问,synchronize是否总是确保读取一致的数据,即使这些数据是由非同步块操作的?同步方法A(){this.count//如果另一个线程在B()方法中修改它,它是否总是读取最新的更改?}方法B(){this.conunt++;…}