gpt4 book ai didi

java - 如何在java中重现竞争条件?

转载 作者:行者123 更新时间:2023-12-01 12:58:39 25 4
gpt4 key购买 nike

我尝试创建这样的竞争条件。

class Bankaccount {

private int balance=101;

public int getBalance(){
return balance;
}
public void withdraw(int i){
balance=balance-i;
System.out.println("..."+balance);
}
}


public class Job implements Runnable{

Bankaccount b=new Bankaccount();

public void run(){
if(b.getBalance()>100){
System.out.println("the balanced ammount is"+b.getBalance());
/*try{
Thread.sleep(9000);
}
catch(Exception e){

}*/
makeWithdrawl(100);
}
}

public void makeWithdrawl(int ammount){

b.withdraw(ammount);
System.out.println(b.getBalance());

}
public static void main(String[] args) {

Job x=new Job();
Job y=new Job();

Thread t1=new Thread(x);
Thread t2=new Thread(y);
t1.start();
t2.start();
}

}

我得到输出:平衡金额为101...11平衡金额为101...1

我预计它会是负数,因为 100 发生了两次提款

这里缺少什么?提前致谢

最佳答案

当多个线程更改共享数据时,就会出现竞争条件。在您的示例中,每个线程都有自己的 Bankaccount 类。您需要将其共享,如下所示:

class Job implements Runnable{

Bankaccount b;

Job(Bankaccount b){
this.b = b;
}

public void run(){
if (b != null)
if(b.getBalance()>100){
System.out.println("the balanced ammount is " + b.getBalance());
makeWithdrawal(100);
}
}

public void makeWithdrawal(int ammount){
b.withdraw(ammount);
System.out.println(b.getBalance());
}

public static void main(String[] args) {

// Creating one Bankaccount instance
Bankaccount b = new Bankaccount();

// Passing one instance to different threads
Job x=new Job(b);
Job y=new Job(b);

Thread t1=new Thread(x);
Thread t2=new Thread(y);

// Race conditions may appear
t1.start();
t2.start();
}

}

不幸的是,这还不够。多线程程序是不确定的,多次执行程序后可能会收到不同的结果。例如,线程 t1 可以在线程 t2 开始检查余额之前设法进行提款。因此t2不会因为缺钱而提现。

为了增加负余额的可能性,您可以在检查余额和取款之间插入延迟。

关于java - 如何在java中重现竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23683419/

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