Java多线程同步中的两个特殊类 - 编程入门网
变)。按照我们的预想,应该不会发生金额不足的问题。首先看代码:
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。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |