银行取钱的问题,两个线程未同步,代码如下所述:package com.daniel.thread;public class FetchMoney { public static void main(String[] args) { Bank bank = new Bank();
Thread accounterThread = new MoenyThread(bank); // 柜台
// bank = new Bank();
Thread atmThread = new MoenyThread(bank); // ATM
accounterThread.start();
atmThread.start();
}}
/*
* 银行类
*/
class Bank {
private int money = 1000;
public int getMoney(int number){
if( number < 0){
return -1; // 取钱数为负数
} else if(number > this.money){
return -2; // 取钱数大于账户中钱数
} else if(money < 0){
return -3;
}
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
money -= number;
System.out.println("left money: " + money);
return number;
}
}
}
class MoenyThread extends Thread{ private Bank bank;
public MoenyThread(Bank bank){
this.bank = bank;
}
@Override
public void run() {
System.out.println(bank.getMoney(800));
}
}
程序运行结果有三种情况,其中一种情况如下:
left money: 200
left money: 200
800
800
这种结果的线程是如何运行的?多线程Java
Thread accounterThread = new MoenyThread(bank); // 柜台
// bank = new Bank();
Thread atmThread = new MoenyThread(bank); // ATM
accounterThread.start();
atmThread.start();
}}
/*
* 银行类
*/
class Bank {
private int money = 1000;
public int getMoney(int number){
if( number < 0){
return -1; // 取钱数为负数
} else if(number > this.money){
return -2; // 取钱数大于账户中钱数
} else if(money < 0){
return -3;
}
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
money -= number;
System.out.println("left money: " + money);
return number;
}
}
}
class MoenyThread extends Thread{ private Bank bank;
public MoenyThread(Bank bank){
this.bank = bank;
}
@Override
public void run() {
System.out.println(bank.getMoney(800));
}
}
程序运行结果有三种情况,其中一种情况如下:
left money: 200
left money: 200
800
800
这种结果的线程是如何运行的?多线程Java
这里的转化如果看不懂,就要看更基础的东西了当两个线程同时执行int tmp = money - number时,tmp均为200。number不管怎样都是800。
你就想象成 多个人 去拿钱。同步的线程是 1次只能1个人拿。不同步的是一窝蜂乱咬...自然有问题。你需要同步你代码,方法如下:
//在线程共同访问的方法加入同步块synchronized public synchronized int getMoney(int number){
if( number < 0){
return -1; // 取钱数为负数
} else if(number > this.money){
return -2; // 取钱数大于账户中钱数
} else if(money < 0){
return -3;
}
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
money -= number;
System.out.println("left money: " + money);
return number;
}
}
yes