gpt4 book ai didi

Java多线程银行转账、同步问题

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

我正在尝试多线程银行转账问题。但是,我在正确同步线程时遇到问题。线程在帐户之间执行转账后会定期进行测试,以确保没有获得或损失金钱。

当线程进入测试方法时,它应该设置一个标志来阻止任何其他线程进入传输方法,然后等待,直到当前执行传输的所有线程结束。

public void transfer(int from, int to, int amount) {        
//finish running all threads' current transactions before test

accounts[from].waitForAvailableFunds(amount);
if (!open) return;

//checks to see if any thread is currently testing
//if so, wait
while(flag) {
try {
wait();
} catch (InterruptedException e) { /*ignore*/ }
}

//do not execute these two statements when a thread
//is performing a test
if (accounts[from].withdraw(amount)) {
accounts[to].deposit(amount);

}

if (shouldTest() && !flag) test();

}

//only one thread can perform a test at any given moment
public synchronized void test() {

//when test starts set a flag telling threads to
//not begin any new transfers
flag = true;

//wait for all threads currently performing transfers
//to finish current transfer before continuing


int sum = 0;
for (int i = 0; i < accounts.length; i++) {
System.out.printf("%s %s%n",
Thread.currentThread().toString(),accounts[i].toString());
sum += accounts[i].getBalance();
}
System.out.println(Thread.currentThread().toString() +
" Sum: " + sum);
if (sum != numAccounts * initialBalance) {
System.out.println(Thread.currentThread().toString() +
" Money was gained or lost");
System.exit(1);
} else {
System.out.println(Thread.currentThread().toString() +
" The bank is in balance");
}

//reset flag and notify threads test is complete.
flag = false;
notifyAll();
}

首先,我什至不确定我是否已正确设置标志并等待。其次,如何让进入测试方法的线程等待所有其他已经在执行传输的线程来完成当前的传输。

谢谢

最佳答案

我认为你应该使用 volatile 来装饰该标志,以确保它在不同线程中更改时受到影响。

关于Java多线程银行转账、同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12682113/

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