Java线程(下).ppt

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

Java线程(下) 目标 了解多线程的基本概念 理解synchronized关键字的含义 掌握线程的同步技术。 死锁以及如何避免死锁 多线程 多线程编程 多个线程来自同一个Runnable实例 多个线程使用同样的数据和代码 例子: Thread t1 = new Thread(object1); Thread t2 = new Thread(object1); 多线程例子 … … RunningObject ro = new RunningObject(); Thread t1 = new Thread(ro,1st); Thread t2 = new Thread(ro,2nd); t1.start(); t2.start(); … … 多线程共享数据时的问题 经典的银行取款问题 有一个银行账户,还有余额1100元,现在A通过银行卡从中取1000元,而同时另外一个人B通过存折也从这个账户中取1000元。取钱之前,要首先进行判断:如果账户中的余额大于要取的金额,则可以执行取款操作,否则,将拒绝取款。 我们假定有两个线程来分别从银行卡和存折进行取款操作,当A线程执行完判断语句后,获得了当前账户中的余额数(1000元),因为余额大于取款金额,所以准备执行取钱操作(从账户中减去1000元),但此时它被线程B打断,然后,线程B根据余额,从中取出1000元,然后,将账户里面的余额减去1000元,然后,返回执行线程A的动作,这个线程将从上次中断的地方开始执行:也就是说,它将不再判断账户中的余额,而是直接将上次中断之前获得的余额减去1000。此时,经过两次的取款操作,账户中的余额为100元,从账面上来看,银行支出了1000元,但实际上,银行支出了2000元。 多线程共享数据时的问题 临界资源问题 当有两个线程A和B同时使用了stack类的一个实例时,A要往堆栈里push数据,而B则要从堆栈中pop数据: (1)操作之前,堆栈中有两个字符: data = | a | c | | | | | top = 2 (2)A执行push中的第一条语句data[top] = ‘r’: data = | a | c | r | | | | top = 2 (3)A还没有执行index++语句,A被B中断,B执行pop()方法,返回‘c’: data = | a | c | r | | | | top = 1 (4)A继续执行index++语句: data = | a | c | r | | | | top = 2 最后的结果是r并没有添加到堆栈中去。 示例 互斥锁 在Java语言中,引入了对象互斥锁(mutual exclusive lock,也简称为对象锁)的概念,来保证共享数据操作的完整性: 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 关键字synchronized 来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。 关键字synchronized 在Java中的两种使用synchronized的方式: 放在方法前面,这样,调用该方法的线程均将获得对象的锁。 放在代码块前面,它也有两种形式: synchronized (this){… …}或synchronized {… …}:代码块中的代码将获得当前对象引用的锁 synchronized(otherObj){… …}:代码块中的代码将获得指定对象引用的锁 synchronized例子 释放锁 如果一个线程一直占用一个对象的锁,则其他的线程将永远无法访问该对象,因此,需要在适当的时候,将对象锁归还。 当线程执行到synchronized()块结束时,释放对象锁。 当在synchronized()块中遇到break, return或抛出exception,则自动释放对象锁。 当一个线程调用wait()方法时,它放弃拥有的对象锁并进入等待队列。 死锁 是指两个线程,都相互等待对方释放lock 是不可测知或避开的 应采取措施避免死锁的出现 wait、notify和notifyAll方法 Object 类定义了 wait()、notify() 和 notifyAll() 方法。可以让线程相互通知事件的发生。要执行这些方法,必须拥有相关对象的锁。 wait() 会让调用线程休眠,直到用 Thread.interrupt() 中断它、过了指定的时间、或者另一个线程用 notify() 或 notifyAll() 唤醒它。 当对某个对象调用 notify() 时,如果有任何

文档评论(0)

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

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

1亿VIP精品文档

相关文档