这个简单的程序有一个共享数组和 2 个线程: 第一个线程 - 显示数组中值的总和。 第二个线程 - 从数组的一个单元格中减去 200,并向另一个单元格添加 200。
我希望看到结果:1500(数组的总和),1300(如果显示发生在减法和加法之间)。
但是由于某种原因,有时会出现1100和1700,我无法解释......
public class MainClass {
public static void main(String[] args) {
Bank bank = new Bank();
bank.CurrentSum.start();
bank.TransferMoney.start();
}
}
class Bank {
private int[] Accounts = { 100, 200, 300, 400, 500 };
private Random rnd = new Random();
Thread CurrentSum = new Thread("Show sum") {
public void run() {
for (int i = 0; i < 500; i++) {
System.out.println(Accounts[0] + Accounts[1] + Accounts[2]
+ Accounts[3] + Accounts[4]);
}
}
};
Thread TransferMoney = new Thread("Tranfer"){
public void run(){
for(int i=0; i<50000; i++)
{
Accounts[rnd.nextInt(5)]-=200;
Accounts[rnd.nextInt(5)]+=200;
}
}
};
}
最佳答案
您没有以原子或线程安全的方式更新值。这意味着有时您会看到 -200 比 +200 多两个,有时您会看到 +200 比 -200 多两个。当您迭代这些值时,可能会看到 +200 值,但 -200 值是较早的值,您会错过它,但您会再次看到另一个 +200 更新,缺少 -200 更改。
在极少数情况下,应该可以看到最多 5 x +200 或 5 x -200。
关于java - 多线程程序中出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769395/