银行取钱的问题,两个线程未同步,代码如下所述: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

解决方案 »

  1.   

    money -= number => money = money - number => int tmp = money - number; money = tmp;
    这里的转化如果看不懂,就要看更基础的东西了当两个线程同时执行int tmp = money - number时,tmp均为200。number不管怎样都是800。
      

  2.   

    你哪里同步了,没同步嘛。多线程,操作同个资源。
    你就想象成 多个人 去拿钱。同步的线程是 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;
            }
             
        }
      

  3.   

    你的意思是两个线程在同一时间执行了 money -= number;这一行?
      

  4.   

    你的意思是两个线程在同一时间执行了 money -= number;这一行?
    yes