《Java程序设计及应用》课件06-2_第1页
《Java程序设计及应用》课件06-2_第2页
《Java程序设计及应用》课件06-2_第3页
《Java程序设计及应用》课件06-2_第4页
《Java程序设计及应用》课件06-2_第5页
已阅读5页,还剩6页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

内容提要多线程的同步同步代码块同步方法线程间的通信wait/notifyAll多线程的同步线程安全同步代码块同步方法线程安全当多个线程共享某数据资源时,就有可能发生不安全的情况。例程该程序的输出结果中竟有0号票,这是不对的。这是因为一个线程在if条件检查时当前票号还是正的,接下来该线程睡眠0.3秒,这期间另外一个线程可能已经继续卖票了,这时票号已减为0,0.3秒后该线程再继续卖票,这就是卖0号票了。这种情况称为线程不是安全的,为了线程的安全性,Java引入了多线程的同步机制。同步方式有两种:同步代码块和同步方法。同步代码块该同步方式的语法如下:synchronized(lockObject){

代码块...

}注意关键字synchronized后面有一个参数lockObject,其含义是同步代码块刚要执行时,先检查lockObject的锁(lock)是开的还是闭的(注意任何Java对象都有锁),若锁是开的,则线程首先把锁关闭,然后执行同步代码块中的所有语句,执行完毕后再把锁打开,若锁是闭的,则线程不执行同步代码块。由此可见,同步代码块的作用就是使代码块成为CPU执行的一个不可分隔的、最小颗粒度的原子操作。注意,lockObject对象必须是在多个线程之间共享的,即多线程的同步靠的是检查同一个对象的锁状态。例程同步方法同步方法的语法是用关键字synchronized来修饰方法头。例程同步方法也是靠检查同一个对象的锁状态,只不过这个对象在代码中没有明确体现,实际上是this对象。知道了这一点,就可以做到在代码块和方法之间同步。例程同步代码块与同步方法相比,建议优先使用同步代码块,因为同步方法的开销大、效率低。生产者和消费者可以分别用两个不同的线程来模拟,它们之间的通信就是等待与通知,java.lang.Object类提供了如下方法用于通信:(1)wait()。执行该方法的线程退出CPU,打开共享对象的锁,处于等待状态(即阻塞状态),等待其他线程的通知唤醒。(2)notify()。该方法通知并唤醒处于等待状态的所有线程中的一个,具体哪个不确定。(3)notifyAll()。该方法通知并唤醒处于等待状态的所有线程,这些被唤醒的线程根据优先级被调度。显然notify()不如notifyAll()好,因此建议使用后者而不是前者。由于线程的通信方法涉及了共享对象的锁,所以必须在线程的同步中进行通信。基于这些知识,我们就可以写出上面介绍的生产-消费信息例子的程序:例程运行上面的程序,输出结果表明:生产者与消费者一唱一和,非常协调。线程间的通信生产者-消费者(Producer-Consumer)模型生产者和消费者通过协作共同完成一件任务,生产者生产信息,消费者消费该信息,过程为:生产者生产一条信息,然后保存在某个地方,然后通知消费者来取信息,接下来生产者处于等待;消费者获取信息后,通知生产者不要再等待了,可以继续生产信息,接下来消费者处于等待状态。这样一直重复下去。小结多线程的同步同步代码块同步方法线程间的通信wait/notifyAll本章小结本章讲解了多线程编程的基本知识和方法:基本概念创建线程线程的生命周期前台、后台线程线程的分支、合并线程间的同步线程间的通信Java语言内置了多线程机制,较许多其他编程语言有着先天的优势。随着多核CPU时代的到来,并行计算必然会成为主流,多线程编程充满了诱惑,也

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论