1. 1、本文档共55页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Ja的va线程

10.4 线程互斥 10.4.1问题的提出 10.4.2 互斥对象 10.4.1问题的提出 首先我们来看一个例子。类Acount代表一个银行账户。其中变量balance是该账户的余额。 public class Acount{ double balance; public Acount(double money){ balance = money; System.out.println(Totle Money: +balance); } } 10.4.1问题的提出 下面我们定义一个线程,该线程的主要任务是从Acount中取出一定数目的钱。 public class AcountThread extends Thread { Acount acount; int delay; public AcountThread(Acount acount,int delay) { this.acount =acount; this.delay = delay; } 10.4.1问题的提出 public void run(){ if(acount.balance = 100){ try{ sleep(delay); acount.balance = acount.balance - 100; System.out.println(withdraw 100 successful!); }catch(InterruptedException e) { } } else System.out.println(withdraw failed!); } 10.4.1问题的提出 public static void main(String[] args) { Acount acount = new Acount(100); AcountThread acountThread1 = new AcountThread(acount,1000); AcountThread acountThread2 = new AcountThread(acount,0); acountThread1.start(); acountThread2.start(); } } 10.4.1问题的提出 该结果非常奇怪,因为尽管账面上只有100元,但是两个取钱线程都取得了100元钱,也就是总共得到了200元钱。出错的原因在哪里呢? 由于线程1在判断满足取钱的条件后,被线程2打断,还没有来得及修改余额。因此线程2也满足取钱的条件,并完成了取钱动作。从而使共享数据balance的完整性被破坏。 参见AcountThread.java 运行结果如下: Totle Money: 100.0 withdraw 100 successful! withdraw 100 successful! 10.4.2 互斥对象 上面的问题,并不是新问题,其实在并发程序设计中已经被研究并得到了解决。我们首先回忆两个概念。在并发程序设计中,对多线程共享的资源或数据成为临界资源,而把每个线(进)程中访问临界资源的那一段代码段成为临界代码段。通过为临界代码段设置信号灯,就可以保证资源的完整性,从而安全地访问共享资源 10.4.2 互斥对象 为了实现这种机制,Java语言提供以下两方面的支持: 1 为每个对象设置了一个“互斥锁”标记。该标记保证在每一个时刻,只能有一个线程拥有该互斥锁,其它线程如果需要获得该互斥锁,必须等待当前拥有该锁的线程将其释放。该对象成为互斥对象。因此,java中的每一个对象都是互斥对象. 2 为了配合使用对象的互斥锁,Java语言提供了保留字synchronized.其基本用法如下: synchronized(互斥对象){ 临界代码段 } 修改后的程序AccountThread2.java AccountThread2.java class Semaphore{} public class AcountThread2 extends Thread { Acount acount; int delay; Semaphore semaphore; public AcountThread2(Acount acount,int delay,Semaphore semaphore) { this.acount =acount; thi

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档