【问题标题】:Java concurrency : Do I have to synchronise a method that only retrieve state and does not modify it?Java并发:我是否必须同步一个只检索状态而不修改它的方法?
【发布时间】:2019-12-23 09:47:41
【问题描述】:

我正在学习 java 并发,并使用了一个多人共享的银行帐户示例来尝试实践并发原理。

这是我的 Account 类。

public class Account(){
    private int balance = 0;

    public int getBalance(){ return balance}              
    public synchronized void deposit(int val){//..}   
    void synchronized void withdrawal(int val){//..}
}

存款和取款方法是同步的,因为它们直接修改Account对象的状态,避免多个用户同时尝试更改时数据损坏。

另一方面,getBalance() 不会更改 Account 对象的状态。但我在想,如果在进行存款或取款时调用getBalance(),它将返回一个过时的值。同步或不同步getBalance() 的标准做法是什么?

【问题讨论】:

  • 不确定您期望在这里得到什么样的答案...如果您想确保您确实获得最新值,请使用synchronized,如果你不在乎。

标签: java concurrency synchronization


【解决方案1】:

如果在存款或取款过程中调用 getBalance(),它会返回过期的值

在这些进程运行时没有过时的值,只是因为您无法确定它们是否会失败(我假设您没有使用 balance 字段表示中间状态)。

所以问题实际上是 - 您是否想读取最近的余额状态并不管提款或存款是否正在运行?或者,您想等到其中一个进程完成后,才能读取该值?

在第一种情况下,您可以简单地将字段设置为 volatile (private volatile int balance = 0;) 以确保线程之间的内存可见性。
在第二种情况下,只需使用synchronized

【讨论】:

    【解决方案2】:

    恕我直言,当您尝试修改属性时,需要同步以避免“竞争条件”。 https://netjs.blogspot.com/2015/06/race-condition-in-java-multi-threading.html

    因此,如果您正在修改它,您可以预测结果。否则,您无法保证会是什么输出。

    除此之外,我可能会将 balance 属性包装到某个 AtomicInteger 中,或者至少将其标记为 volatile。

    【讨论】:

      【解决方案3】:

      你需要同步一个对象而不是字面量,因为只同步对象,这对于比函数更好的性能至关重要。

      Object lock = new Object();
      
            public class Account(){
              private int balance = 0;
      
              public int getBalance(){ synchronized (lock){return balance} }              
              public void deposit(int val){synchronized (lock){...}  }   
              void withdrawal(int val){synchronized (lock){...}  }
            }
          }
      

      通过这种方式,您可以在函数中添加更多逻辑,以更好地执行并在更新时保持平衡同步。

      【讨论】:

      • 不要使用Integer 而不是int 来同步对象。 synchronize(this) 或在您为此创建的 Object lock 上同步。
      猜你喜欢
      • 2020-01-29
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多