gpt4 book ai didi

java - 同步无 volatile

转载 作者:行者123 更新时间:2023-12-02 01:52:30 26 4
gpt4 key购买 nike

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

以下代码是关于竞争条件的,我想知道为什么我从未见过有人在计数变量上使用 volatile :

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

这里不应该算作 volatile 吗?

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

最佳答案

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

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

public int getValue() { return value; }

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

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

关于java - 同步无 volatile ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52790617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com