代码之家  ›  专栏  ›  技术社区  ›  Mohammad Karmi

无易失性同步

  •  0
  • Mohammad Karmi  · 技术社区  · 6 年前

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

      public synchronized void add(int value){
          this.count += value;
      }
    

    不应该在这里吗?

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ravindra Ranwala    6 年前

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

    public class Counter {
        @GuardedBy("this") private volatile int value;
    
        public int getValue() { return value; }
    
        public synchronized int increment() {
            return value++;
        }
    }
    

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