快速业务通道

Java多线程同步中的两个特殊类 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25
变)。按照我们的预想,应该不会发生金额不足的问题。首先看代码:

public class ATMTester{  private static final int NUM_OF_ATM = 10;  public static void main(String[] args)  {   ATMTester tester = new ATMTester();   final Thread thread[] = new Thread[NUM_OF_ATM];   final ATM atm[] = new ATM[NUM_OF_ATM];   for (int i=0; i<NUM_OF_ATM; i++)   {    atm[i] = new ATM();    thread[i] = new Thread(tester.new Runner(atm[i]));    thread[i].start();   }  }  class Runner implements Runnable  {   ATM atm;   Runner(ATM atm)   {    this.atm = atm;   }   public void run()   {    atm.login("John");    //查询余额    float bal = atm.getBalance();    try    {     Thread.sleep(1);     //模拟人从查询到取款之间的间隔    }    catch (InterruptedException e)    { // ignore it }     try     {      System.out.println("Your balance is:" + bal);      System.out.println("withdraw:" + bal * 0.8f);      atm.withdraw(bal * 0.8f);      System.out.println("deposit:" + bal * 0.8f);      atm.deposit(bal * 0.8f);     }     catch (InsufficientBalanceException e1)     {      System.out.println("余额不足!");     }     finally     { atm.logout(); }    }   }}

运行ATMTester,结果如下(每次运行结果都有所差异):

Your balance is:1000.0

withdraw:800.0

deposit:800.0

Your balance is:1000.0

Your balance is:1000.0

withdraw:800.0

withdraw:800.0

余额不足!

Your balance is:200.0

Your balance is:200.0

Your balance is:200.0

余额不足!

Your balance is:200.0

Your balance is:200.0

Your balance is:200.0

Your balance is:200.0

withdraw:160.0

withdraw:160.0

withdraw:160.0

withdraw:160.0

withdraw:160.0

withdraw:160.0

withdraw:160.0

deposit:160.0

余额不足!

余额不足!

余额不足!

余额不足!

余额不足!

余额不足!

Java多线程同步中的两个特殊类(3)

时间:2007-11-05

为什么会出现这样的情况?因为我们这儿是多个ATM同时对同一账户进行操作,比如一个ATM查询出了余额为1000,第二个ATM也查询出了余额1000,然后两者都期望提取出800,那么只有第1个用户能够成功提出,因为在第1个提出800后,账户真实的余额就只有200了,而第二个用户仍认为余额为1000。这个问题是由于多个ATM同时对同一个账户进行操作所不可避免产生的后果。要解决这个问题,就必须限制同一个账户在某一时刻,只能由一个ATM进行操作。如何才能做到这一点?直接通过synchronized关键字可以吗?非常遗憾!因为我们现在需要对整个Account的多个方法进行同步,这是跨越多个方法的,而synchronized仅能对方法或者代码块进行同步。

我们首先开发一个BusyFlag的类,类似于C++中的Simaphore。

public class BusyFlag{  protected Thread busyflag = null;  protected int busycount = 0;  public synchronized void getBusyFlag()  {   while (tryGetBusyFlag() == false)   {    try    {     wait();    }    catch (Exception e) {}   }  }  private synchronized boolean tryGetBusyFlag()  {   if (busyflag == null)   {    busyflag = Thread.currentThread();    busycount = 1;    return true;   }   i

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号