这个例子是要说明当多个线程访问同一个数据的时候,会出错。原来是while(true)这样会导致程序一直运行,我改为了 运行100 次,已经可以看出来这个时候就已经出错了。
import java.lang.Thread;
//本程序演示了数据是如何发生混乱的,当多个线程访问同一个数据结构的时候
public class UnsynchBankTest {
public static void main (String []args)
{
Bank b=new Bank(NACCOUNT,INITIAL_BALANCE);
int i;
for(i=0;i<NACCOUNT;i++)
{
TransferRunnable r=new TransferRunnable(b,i,INITIAL_BALANCE);
Thread t=new Thread(r);
t.start();
}
}
public static final int NACCOUNT=100;
public static final double INITIAL_BALANCE=1000;
}
//银行,带有很多个账户
public class Bank {
public Bank(int n,double initialBalance)
{
accounts=new double[n];
for(int i=0;i<accounts.length;i++)
accounts[i]=initialBalance;
}
//从一个账户里转账给另外一个账户
public void transfer(int from ,int to,double amount)
{
if(accounts[from]<amount) return;
System.out.print(Thread.currentThread());
accounts[from]-=amount;
System.out.printf("%10.2f from %d to %d",amount,from,to);
accounts[to]+=amount;
System.out.printf("Total Balance:%10.2f%n",getTotalBalance());
System.out.println();
}
//得到账户余额的和
public double getTotalBalance()
{
double sum=0;
for(double a:accounts)
sum+=a;
return sum;
}
public int size()
{
return accounts.length;
}
private final double[] accounts;
}
import java.lang.*;
// 一个runnable 把钱从一个账户转入到另外一个账户
public class TransferRunnable implements Runnable{
public TransferRunnable(Bank b,int from,double max)
{
bank=b;
fromAccount=from;
maxAmount=max;
}
public void run()
{
try
{
int ii=0;
while (ii<100)//原文是true 造成该程序永远不停止,实在是没有必要了
{
ii++;
int toAccount=(int) (bank.size()*Math.random());
double amount=maxAmount*Math.random();
bank.transfer(fromAccount,toAccount,amount);
Thread.sleep((int)(DELAY*Math.random()));
}
}
catch(InterruptedException e)
{
}
}
private Bank bank;
private int fromAccount;
private double maxAmount;
private int DELAY=10;
}
运行结果(100个结果,我只截取了片段):
Thread[Thread-4,5,main]Thread[Thread-2,5,main] 7.01 from 4 to 59Thread[Thread-5,5,main]Thread[Thread-0,5,main] 752.87 from 0 to 98Total Balance: 98941.40
Thread[Thread-3,5,main] 528.42 from 3 to 72Thread[Thread-1,5,main] 356.98 from 1 to 59Total Balance: 98941.40
98.44 from 5 to 46Total Balance: 99039.84
Total Balance: 99039.84
所有Balance 不是10000的 都是出错的