core java 全套课件.ppt

  1. 1、本文档共353页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多线程的同步和通信 synchronized也可以修饰语句块,synchronized修饰的语句块称为同步代码块。 synchronized修饰同步代码块时,必要要对某一个对象加锁才能同步,所以需要一个对象;如synchronized(this){..}或synchronized(o){..} o为Object对象 This代表当前对象,只有拿到当前对象或对象o的锁标记的线程才能进入同步代码块执行 锁池 线程想要调用同步方法或进入同步代码块执行,必须要拿到对象的锁标记,如果拿不到对象的锁标记则现程就会被堵住暂停,那么这些被堵住的线程在哪里呢?他们会在对象的锁池里 锁池是一个空间,每个对象都有,存放等待该对象锁标记的线程 对象o有一个同步代码块,如synchronized(o){..}当线程还没有拿到对象o的锁标记时,则就会被阻塞在对象o的锁池里等待;当另一个线程释放了该对象o的锁标记后,则在锁池中的很多线程会去争拿锁标记,其中只有一个线程可以拿到锁标记,进入运行状态。那么在锁池中的其他多个线程到底谁先拿到锁标记呢?这是由操作系统决定的,随机的。 在java中,一个线程可以同时拿到多个对象的锁标记,所以同步代码块是可以嵌套的。如:synchronized(o1){..synchronized(o2){…}..} 死锁的产生、原因和特性 在一个线程进入锁池后不会释放任何它已拥有的锁标记,正是因为这样,才会有死锁产生 同步的使用和特性 当一个线程正在访问对象o的同步方法时,则另一个线程无法访问该对象的同步方法,但可以访问该对象的非同步方法 自定义的类,对象是要被多个线程访问时则一定要考虑同步问题 我们在设计对象的方法时,若方法要改变对象的状态则方法就要加同步,若不改变对象的状态则一般不加同步 一般情况,写方法会改变对象状态,所以add,set需要加同步;读方法不会改变状态,则不加同步;但是若是一写多读情况时都需要加同步,否则一个写另一个读,读出错误结果 synchronized修饰符可以修饰哪些方法 可以修饰静态方法;可以修饰非静态方法;不能修饰构造方法;不能修饰抽象方法;写代码来T.java演示 死锁的产生、原因和特性 什么是死锁 死锁是线程同步的一个特殊情况而已 分析死锁情况 例如:t1线程准备进入 synchronized(o1){…synchronized(o2){…..}….} 死锁的产生、原因和特性 t2线程准备进入 synchronized(o2){….synchronized(o1){…...}….} t1线程想进入o1的同步代码块,则必须拿到o1的锁标记,假如t1已拿到了o1的锁标记,进入了o1同步代码块中;此时t1还想进入o2同步代码块 t2线程想进入o2的同步代码块,则必须拿到o2的锁标记,假如t2已拿到了o2的锁标记,进入了o2同步代码块中;此时t2还想进入o1同步代码块 t1想要进入o2的同步代码块则就还要拿到o2的锁标记,但是o2的锁标记还在t2那里,所以t1进入o2的锁池等待但同时它又不会释放它已有的o1的锁标记 t2想要进入o1的同步代码块则就还要拿到o1的锁标记,但是o1的锁标记还在t1那里,所以t2进入o1的锁池等待但同时它又不会释放它已有的o2的锁标记 于是这两个线程t1,t2就都在各自的锁池里,而且也永远不会拿到各自需要的锁标记,这种情况就叫死锁 死锁产生的条件和应用 条件 首先得有2个临界资源,接着有2个线程都各自拥有一个临界资源的锁标记,然而这2个线程都不释放自己已拥有的资源的锁标记,却又互相申请对方已拥有的锁标记。 死锁的产生、原因和特性 应用 在OS中,多线程多资源的死锁问题经常需要控制和处理,哲学家进餐问题就是一个典型的死锁问题 每一个为哲学家,只有一根筷子,每个哲学家都不可能进餐,因为他们分别都拿着自己的一根筷子不肯放下借给别人用但自己又因为缺少筷子无法进餐,这就是死锁。 有锁池的线程状态图 初始状态 new 线程对象 可运行状态 调用start()方法,OS才创建一个线程,但该线程并没有马上执行,只是处于可运行状态,等待时间片 start() 运行状态 被OS调度选中分得时间片 OS分配的时间片执行完/调用yield()让位方法 阻塞状态 终止状态 1、等待数据输入 线程只能在运行状态时才能进入阻塞状态 本线程的代码执行完毕 主线程退出 Jvm关闭退出 2、sleep 3、一个线程调用另 一个线程的join方法 sleep执行完了 数据输入完了 调用join执行完了 锁池状态 Os选中,将锁标记交 给线程执行synchronized代码 运行状态的线程在同一时刻只有一个线程想进入同步代码块却没有得到对象的锁标记则进入锁池等待 多线程的通信 多线程的通信 举例

文档评论(0)

别样风华 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档