java编程多线程并发处理实例解析

  

本文主要是通过一个银行用户取钱的实例,演示java编程多线程并发处理场景,具体如下。

  

从一个例子入手:实现一个银行账户取钱场景的实例代码。
  

  

<强>第一个类:帐户。java
  

  

账户类:

        包cn.edu.byr.test;   公共类账户{   私人字符串accountNo;   私人双平衡;   公共账户(){   }   公共账户(字符串accountNo、双平衡){   这一点。accountNo=accountNo;   这一点。余额=资产;   }   公共int hashcode () {   返回accountNo.hashCode ();   }   公共字符串getAccountNo () {   返回this.accountNo;   }   公共双getBalance () {   返回this.balance;   }   公共空间setBalance(双平衡){   这一点。余额=资产;   }   公共布尔=(对象obj) {   如果(这==obj)   返回true;   如果(obj !=零,,obj.getClass ()==Account.class) {   obj账户目标=(账户);   返回target.getAccountNo () .equals (accountNo);   }   返回错误;   }   }      

<强>第二个类:DrawThread。java
  

  

取钱线程类:

        包cn.edu.byr.test;   公共类DrawThread扩展线程{   私人账户账户;   私人双drawAmount;   公共DrawThread(字符串名称,账户账户,双drawAmount) {   超级(名称);   这一点。账户=账户;   这一点。drawAmount=drawAmount;   }   公共空间run () {//同步(账户){   如果(account.getBalance()在drawAmount) {   System.out.println (getName() +”取钱成功,吐出钞票:“+ drawAmount);//{试//thread . sleep (1);//}//捕获(InterruptedException e) {//e.printStackTrace ();//}   account.setBalance (account.getBalance () - drawAmount);   system . out。println (“\ t余额为:“+ account.getBalance ());   其他}   System.out.println (getName() +”取钱失败,余额不足!”);//}   }   公共静态void main (String [] args) {   账户acct=新帐户(" 123456 ",1000);   新DrawThread (“A”, 800年acct) .start ();   新DrawThread (“B”, 800年acct) .start ();   }   }      

<强>上面代码中注释掉的部分:(1)同步同步代码块(2)线程休眠。如果注释掉(1),(2),则运行结果有多种可能性,可能性之一(概率较小),符合正常逻辑:
  

  

B取钱成功,吐出钞票:800.0
  余额为:200.0
  一个取钱失败,余额不足!
  

  

应该是B先强找到取钱资源,并且正确修改余额后,一个才开始判断用户余额,这种概率非常小,多数运行会类似以下情况:
  

  

一个取钱成功,吐出钞票:800.0
  B取钱成功,吐出钞票:800.0
  余额为:-600.0
  余额为:200.0
  

  

这明显是不符合逻辑的,从运行结果可以猜测,一个先抢占资源,取出金额,但在修改余额之前,资源被B抢占;由于余额未被修改,则B看到余额仍然是800 B仍然取出金额;一个先运行修改余额,但并未打印,B抢夺资源;B修改余额,并打印余额,为-600;一个打印余额,为200;

  

如果加上(2)线程休眠,则一定是错误状况,因为A或B在取出金额后一定会因睡眠为释放CPU资源,JVM会调用其他处于准备状态的进程第。二个取钱判断余额一定是错误的。

  

如果加上(1)同步同步代码块,在线程运行方法体中对账户进行加锁,则每次都会保证执行逻辑正常:
  

  

一个取钱成功,吐出钞票:800.0
  余额为:200.0
  B取钱失败,余额不足!
  可以设想一下执行过程:
  

  

先抢占资源,在运行方法体初始对账户类进行加锁,然后开始执行同步代码块;如果执行到中间某个环节,CPU资源被B抢占;B开始执行,一开始也会对账户类进行加锁。但是加锁时会发现账户已经被一个占用,则会调整为阻塞状态等待一个释放资源,一个执行完同步代码块后释放帐的锁,B继续执行;B运行时看到的余额保证是一个已经修改过的,会按照正确逻辑正常执行。

  

  

以上就是本文关于java编程多线程并发处理实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

java编程多线程并发处理实例解析