gpt4 book ai didi

Java并发: Do I have to synchronise a method that only retrieve state and does not modify it?

转载 作者:行者123 更新时间:2023-12-02 09:02:53 25 4
gpt4 key购买 nike

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

这是我的帐户类(class)。

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() 的标准做法是什么?

最佳答案

if getBalance() is called while a deposit or withdrawal is happening, it will return the outdated value

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

所以问题实际上是 - 您是否想要读取最新的余额状态,并且无论提款或存款是否正在进行?或者,您想等到其中一个进程完成,以便读取该值?

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

关于Java并发: Do I have to synchronise a method that only retrieve state and does not modify it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59453157/

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