




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,面向对象Java语言程序设计Java多线程及并发控制实现技术,在本单元你能了解如下知识点多线程之间的通信多线程同步互斥多线程间同步协调执行线程优先级调度机制多线程之间的死锁问题,Java多线程及并发控制实现技术,1、多线程的处理不是件容易的事情(1)一方面,创建多个线程极大地消耗系统资源(2)另一方面,多个线程的管理控制也相当困难(控制和调度)(3)更重要的是,如何对线程间共享资源进行合理处理以完全避免死锁的产生2、由多线程带来的性能改善是以可靠性为代价的,主要是因为有可能产生线程死锁和线程不安全等方面的错误而且这些错误很难发现出,因为这些错误是随机产生的。3、体验多线程所可能出现的问题示例,多线程应用概述,1、多线程之间进行通信以传递数据,(1)用管道流实现线程间的通信以传递数据,生产者线程将数据写入到管道流中,而消费者线程从管道流中获取数据。 请见Java的管道的输入与输出 PipedIO.java的示例,(2) 通过一个中间类(该类一般为集合类,承担缓存方面的作用)在线程间传递信息以传递数据,请见文档中体现“多线程之间的通信以传递数据”的程序示例,2、多线程环境下的线程安全,(1)线程安全多线程访问同一代码,不会产生不确定的结果,(3)解决线程安全的方法,(2)线程不安全的应用示例,(4)线程不安全其实是多个线程访问“共享资源”而造成的,(5)解决线程同步的编程要点,3、Java多线程同步互斥,(1)线程同步互斥并发执行的多个线程在某一时间内只允许一个线程在执行以访问共享数据多个线程访问的同一个区域称为临界区。(2)必要性-需要编程出线程安全的类代码当多个线程可以调用单个对象的属性和方法时,对这些调用进行同步处理是非常重要的。否则,一个线程可能会中断另一个线程正在执行的任务,使该对象处于一种无效状态。其成员不受这类中断影响的类叫做线程安全类。,4、线程互斥的实现机制监视器(同步锁) 线程进入监视器后其它线程则不能再进入监视器,直到被锁定的线程退出监视器,下一个线程才能进入监视器被执行最终达到排斥的效果。,(1)如何产生监视器(同步互斥方法或者语句块)通过在被多个线程所共享的代码中应用synchronized关键字定义出同步互斥方法或者语句块。(2)实现的机制(但系统的总体效率会降低)每一个拥有由synchronized限定的对象都含有一个独立的监视器只有某一个线程的synchronized代码执行完后其它线程的synchronized代码才能被执行。,5、同步互斥方法的编程格式(1)同步互斥代码块 synchronized(syncObject) /访问共享资源的代码,也就是需要同步的代码段 由于synchronized 块可以针对任意的代码块,且可任意指定上锁的同步对象(syncObject),因此灵活性较高但同步锁对象本身一定要是共享的对象。,(2)同步互斥方法 public synchronized void myFun() /访问共享资源的代码,也就是需要同步的代码段 这种形式的同步方法其实相当于 如下形式的同步代码块:public void myFun() synchronized(this) /访问共享资源的代码,也就是需要同步的代码段 由于默认采用this作为同步对象(同步锁就是调用该同步方法的对象本身),所以当该对象有多个synchronized的同步方法时,只要一个线程访问了其中的一个同步方法,其它线程将不能再同时访问这个this对象所代表的目标对象中的任何其它一个同步方法)。,但这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。(3)静态同步互斥方法public static synchronized void fun() /访问共享资源的代码,也就是需要同步的代码段这段代码就等价于,同步锁是类定义本身。public static void fun() synchronized(Class.forName()/访问共享资源的代码,也就是需要同步的代码段,但要尽量避免直接把synchronized加在方法定义上,因为要控制线程同步的粒度同步的代码段越小越好,也就是synchronized控制的范围越小越好。 防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。另外:synchronized关键字是不能继承的,也就是说,基类的方法synchronized f() 在继承类中并不自动是synchronized f(),而是变成了f()。继承类需要你显式的指定它的某个方法为synchronized方法;,6、同步互斥方法的编程要点(1)应将访问共享数据的代码设计为synchronized代码;(2)可用synchronized (this).来同步代码块 但使用this作为同步对象,如果同一个类中存在多个如此的synchronized (this).代码块,其中任何一个synchronized(this)代码块处于被执行状态,则其它线程对其它synchronized(this)代码块的访问也会受阻。(3)同步锁本身一定要是共享的对象下面的代码没有任何意义,因为那个同步锁是在函数体内部产生的。每个线程调用这段代码的时候,都会产生一个新的同步锁。那么多个线程之间,使用的是不同的同步锁,因此根本达不到同步的目的。public void fun() Object lock1 = new Object(); / 产生一个同步锁synchronized(lock1) / 访问共享资源并且需要同步控制的代码 ,(4)同步代码的锁定目标对象一定是共享可变资源对象public static final Object lockObj= new Object();public void fun()synchronized(lockObj)/ 访问共享资源并且需要同步控制的代码 在代码中声明lockObj时,使用了final关键字的目的是为了保证lockObj的对象引用在整个系统运行过程中都保持不变。,7、对象锁-当线程调用同步方法时,同步对象将转为“锁定”状态(1)理解多线程技术中的对象锁假设有一个电话亭,并且假设它里面有一把锁。当一个线程进入同步方法时,它便关闭电话亭的门,并且将它锁起来。当另一个线程试图调用同一个对象上的同步方法时,它无法打开电话亭的门,困此它将停止运行。,(2)线程调度程序定期使用激活规则对等待门锁打开的线程进行激活每当一个想要调用对象上的同步方法的线程想再次运行时,它要查看该对象是否仍然处于锁定状态。如果该对象的锁已经打开,那么该线程便是下一个获得对该对象的唯一访问权的线程。,8、多线程同步互斥方法的实例(1)问题描述现有一个线程产生0-19数据,数据由Vevtor集合存储,另一个线程输出Vector集合中的数据。(2)程序代码:请见synThread.java文件(3)本示例执行后的结果截图(4)对比有synchronized关键字和没有synchronized时的两者得到结果的不同(左面的是正确的,存取相互一致,而右面的则不一致),9、同步互斥方法实例(1)本示例的问题描述编程模拟银行计算利息,由线程管理50个出纳(50个线程),计算全部出纳付出的总利息,其中每个出纳处理10笔钱,每笔款额为1000元,利息为0.1。(2)程序代码:请见TongBuApp.java文件(该程序为Applet/Application的混合程序),(3)没有应用同步互斥方法控制时的计算结果有错(不是逐个累加状态)其原因是所创建的50个线程都要调用calculate()及addlist()方法,并且线程具有可重入性线程的可重入性是指一个线程的调用还未结束,另一个线程的调用已经可能开始!,(4)改进的措施是将run()方法设置为同步方法,最终的结果是正确的(为逐个累加状态),10、多线程间同步协调执行(1)线程同步协调执行信号量模型并发执行的多个线程之间互相发送消息进行合作、互相等待,按一定速度配合执行一个线程等待另外一个线程的执行并根据该线程的执行结果自己再执行或者改变自身的工作状态(2)应用的场合在“生产者-消费者”或者“读写同步模型”式的问题中,两者的处理速度由于存在很大的差异。因此需要在两者之间提供一个隐藏的“桥梁”来缓解这样的差异。,(4)应用要求生产者每生产出一件产品(创建出数据),消费者都能及时地消费它(使用数据),不能提前或落后;否则将不匹配(消费者获取的数据将不是生产者产生的数据)。,在实际应用中我们经常会遇到“生产”与“消费”之间需要协调的问题,一定要等生产出来了,才能消费。比如:在一个类中,有一个方法是将某一个变量的值加1;另一个类中的方法则是将这个变量的每次变化都显示出来。,(3)若共享对象中只能存放一个数据,可能出现以下问题生产者比消费者快时,消费者会漏掉一些数据没有取到;消费者比生产者快时,消费者取相同的数据。,11、正确地理解和应用“生产者/消费者”模型(1)信号量模型的工作方式线程在运行的过程中,可以主动停下来,等待某个信号量的通知;此时该线程就进入到该信号量的待召(Waiting)队列当中;等到通知之后,再继续运行。“生产者和消费者”的问题其实是信号量模型的具体应用。(2)正确地识别生产者和消费者生产者:产生数据的对象,如示例中将变量+1的方法无疑就成了生产者消费者:使用数据的对象,如示例中显示变量变化的方法就是个消费者(3)如何协调生产者和消费者传递和改变状态本示例的数据显示的逻辑很简单,一定是要等这个变量发生变化了,才能显示出来!也就是说这两个方法之间要有一种传递各自工作成果的状态信息。,12、Java中提供的支持同步协调的各种APIObject对象的wait()方法就是等待通知,Object对象的notify()方法就是发出通知。(1)利用 wait()(释放同步锁,自身进入等待队列)(2)notify()(唤醒等待队列中的第一个线程,并把它移入同步锁申请队列中)(3)notifyAll()(唤醒等待队列中的所有线程)。,13、wait()/notify()的实现原理和应用要点(1)wait()方法的作用是让当前正在执行的线程释放其所持有的“对象互斥锁”,同时自身进入到“wait队列”(等待队列);(2)当然在自身进入到“wait队列”时,应该应用notify()/notifyAll()方法来唤醒一个或所有正在等待队列中等待的其它的线程,并将它(们)移入可运行的队列中(或者称为同步锁申请队列中)。,(3)wait()/notify()方法的应用要点它们只能在synchronized同步代码中被调用。(4)代码示例等待某个信号量的通知public static final Object signal = new Object();public void fun1() synchronized(singal) / 首先我们要获取这个信号量。这个信号量同时也是一个同步锁signal.wait(); /这里要放弃信号量,并进入signal信号量的待召(Waiting)队列 ,发出某个信号量的通知 public void fun2() synchronized(singal) / 首先我们要获取这个信号量。这个信号量同时也是一个同步锁signal.notify(); /通知signal的待召队列中的某个线程 ,14、同步的主要方式(1)线程与进程之间同步通讯(2)线程与线程之间同步通讯,15、线程与进程之间通讯实例(1)程序代码:请见ThreadCom .java,它为Applet/Application的混合程序(2)未采用同步方法时-程序执行结果有错,生产者(移动鼠标)与消费者(线程)未同步,(3)采用同步方法时 程序执行结果正确,生产者(移动鼠标)与消费者(线程)同步,16、线程与线程之间通讯实例(1)程序代码请见PrdCons.java(2)未将get()和put()方法设置为同步方法时的执行结果不正确 (3)将get()和put()设置为同步方法时的执行结果正确,17、多线程之间的死锁(1)死锁的条件同时执行两个或两个以上的线程时,如果每个线程都占有一个资源并请求另一个资源,这时就会出现死锁也就是2个对象都在调用对方的同步的方法,都在等着对方开锁。,(2)如果一个线程已经持有一个锁并还试图再获取同步锁时,就有死锁的危险,(3)死锁主要出现在相互等待的状况下,18、导致死锁的根源 在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问而造成的。19、再次理解“synchronized”关键词的作用(1)它确保在某个时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中考化学试题分类汇编:科学探究题(第2期)解析版
- 1 丰富的数据世界教学设计-2025-2026学年初中数学北师大版2024七年级上册-北师大版2024
- 1秋天 教学设计-2024-2025学年语文一年级上册(统编版)
- 2025年天津市河西区中考一模物理试题(解析版)
- 小学语文一遍过单元测试卷(3篇)
- 第一章有理数-单元测试卷-2025-2026学年人教版数学
- 2025年全国汽车驾驶员(技师)职业技能考试题库(含答案)
- 本册综合教学设计-2025-2026学年中职语文拓展模块语文版
- 2025年高考数学二模试题分类汇编(辽宁专用)立体几何与空间向量(解析版)
- 2025年食品企业生产工安全生产知识考试试题及答案
- 2025年老司机三力测试题及答案
- (2025年标准)货拉拉签协议书
- 学堂在线 中国传统艺术-篆刻、书法、水墨画体验与欣赏 章节测试答案
- 工厂供电理论知识培训课件
- 2025年中国船舶集团校园招聘面试模拟题及答案
- 2025房屋租赁托管合同示范文本
- (2025年标准)股东合伙协议及分红协议书
- 污水处理厂设备安装施工方案
- 水稻全程机械化栽培技术
- 北京师大附中市级名校2026届中考适应性考试语文试题含解析
- 2025年秋季学期初中学校全面工作安排(含各周重点工作安排)
评论
0/150
提交评论