gpt4 book ai didi

Java 和同步问题

转载 作者:行者123 更新时间:2023-11-30 03:56:33 25 4
gpt4 key购买 nike

我正在用 Java 编写一个程序,我有点担心同步问题。

场景非常“简单”,我们有一个简单的银行帐户类,多个人可以从帐户中提取资金(尽管他们不能存款),他们也可以检查帐户的余额。问题是余额一直在变化,因此我们希望客户查看正确的余额!

这是到目前为止我的类(class)。

    class Account implements Serializable {

private boolean available = false;

String ac_id;
String name;
int balance;

public Account(String ac_id, String name, int blnc)

{
this.ac_id = ac_id;
this.name = name;
this.blnc = blnc;

}

public synchronized int getMoney(int money) {
if (money > blnc) {
return -1;
}
while (available == true) {
try {
wait();
} catch (InterruptedException e) {
}
}

blnc -= money;
available = true;
notifyAll();
return 1;
}

public synchronized int chkBalance() {

return blnc;
}

@Override
public String toString()

{
return "Balance: " + chkBalance();
}

}

正如您所看到的,通过此实现,我可以确保某人可以从一个帐户对象获取资金,但随后该帐户对象被阻止,那么一种解决方案是

public synchronized int chkBalance()   

添加 available = false; 的方法似乎解决了我的问题,但我真的不能说这是否正确,我的意思是它们是否确实同步并且客户看到正确的余额。

提前致谢!!

附注理论上,如果我在这两个方法之前都使用同步字,不就可以了吗?我的意思是,一次只有一个线程占用每个方法,并且由于不需要存款,使用 boolean 可用真/假有什么意义?

最佳答案

您根本不需要可用的 boolean 值。仅同步 getMoney 方法并使 blnc 可变就足够了,以便检查更改的其他线程将能够看到它们。尝试这样的事情:

class Account implements Serializable {

final String ac_id;
final String name;
volatile int blnc;

public Account(String ac_id, String name, int blnc) {
this.ac_id = ac_id;
this.name = name;
this.blnc = blnc;
}

public synchronized int getMoney(int money) {
if (money > blnc) {
return -1;
}
blnc -= money;
return 1;
}

public int chkBalance() {
return blnc;
}

@Override
public String toString() {
return "Balance: " + chkBalance();
}
}

关于Java 和同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23030723/

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