package com.multiThreadstudy;
public class Bank {
protected final static int MUN_ACCOUNTS=8;
private int[] accounts=new int[MUN_ACCOUNTS];
public Bank()
{
for(int i=0;i<MUN_ACCOUNTS;i++)
{
accounts[i]=10000;
}
}
public void showAccounts()
{
int total=0;
for(int i=0;i<Bank.MUN_ACCOUNTS;i++)
{
total+=accounts[i];//System.out.println(i);
}
System.out.println("银行总存款为"+total);
}
public synchronized void transfer(int from,int into,int amount)
{
if(accounts[from]>=amount&&from!=into)
{
int newAccountFrom=accounts[from]-amount;
int newAccountInto=accounts[into]+amount;
try {
Thread.sleep(3000);
accounts[from]=newAccountFrom;
accounts[into]=newAccountInto;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public int getAmount(int id)
{
return accounts[id];
}
}
package com.multiThreadstudy;
public class Customer extends Thread {
private int customerID;
private boolean running;
private Bank bank;
public Customer(int id,Bank bank)
{
this.customerID=id;
this.running=false;
this.bank=bank;
}
public void run()
{
int into=0;
int amount=0;
while(running)
{
into=(int)(Bank.MUN_ACCOUNTS*Math.random());
amount=(int)(bank.getAmount(this.customerID)*Math.random());
bank.transfer(this.customerID,into,amount);
yield(); //让其他线程有运行的时间
}
}
public void start()
{
running=true;
super.start();
}
public void halt()
{
running=false;
}
}
package com.multiThreadstudy;
public class test {
public static void main(String[] args)
{
Bank bank=new Bank();
Customer[] customers=new Customer[Bank.MUN_ACCOUNTS];
for(int i=0;i<Bank.MUN_ACCOUNTS;i++)
{
customers[i]=new Customer(i,bank);
customers[i].start();
}
for(int i=0;i<40;i++)
{
bank.showAccounts();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
如果没有在transfer函数加上
synchronized,哪门银行的总存款会不断的减少。
java模拟多用户取款(多线程同步)
最新推荐文章于 2023-11-30 08:28:02 发布