- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第07章 多线程(信息学院2013级)精要
【例7.5】 银行账户的存/取款线程设计。 图7.7 并发线程共享临界资源 2. 并发执行的交互线程间存在与时间有关的错误 结果的原因分析: 有3个线程同时操作wang帐号,由于线程调度的因素,在某个线程执行的过程中(还没有结束),会被中断执行,转而执行另外一个线程。 * 7.3.2 线程间的竞争关系与线程互斥 线程间的竞争关系 两个线程共享同一资源,一个线程获得该资源,另一个线程就必须等待。 极端的状态:被阻塞线程永远得不到访问权。出现两个问题:死锁、饥饿。 * 2. 线程互斥和临界区管理 操作系统对共享一个变量的若干线程进入各自临界区有以下3个调度原则: 一次至多一个线程能够在它的临界区内。 不能让一个线程无限地留在它的临界区内。 不能强迫一个线程无限地等待进入它的临界区。特别地,进入临界区的任一线程不能妨碍正等待进入的其他线程的进展。 临界资源:多线程共享变量代表的资源称为临界资源; 临界区:并发线程中与共享变量有关的程序段称为临界区 * 3. Java的线程互斥实现 (1) 同步语句 synchronized (对象) //对象即临界资源 语句 //语句块为临界区 (2)同步方法 synchronized 方法声明 //同步方法体为临界区 基于操作系统对于线程进入临界区的3条原则,可以使用同步语句和同步方法来实现线程互斥。 * 【例7.6】 互斥的存/取款线程设计。 图7.9 带互斥锁的并发线程执行流程 * 线程体中互斥锁的用法 public void run() { synchronized(this.account) //声明临界区,锁定指定账户对象 { double howmatch = this.account.balance(); try { Thread.sleep(1); } //花费时间 catch(InterruptedException e) {} this.account.put(this.value); System.out.println(this.account.getName()+账户:现有+howmatch+, 存入+this.value+, 余额+this.account.balance()); } } 保证了存钱或取钱操作过程中不会被其他线程中断 只有完成一次性完整存钱或取钱操作,才把资源释放给其他线程。 * 同步方法实现互斥 * public void run() { doRun(); } public synchronized void doRun() { double howmatch = this.account.balance(); try { Thread.sleep(1); // 花费时间 } catch (InterruptedException e) { } this.account.put(this.value); System.out.println(this.account.getName() + 账户:现有 + howmatch + , 存入 + this.value + , 余额 + this.account.balance()); } 7.3.3 线程间的协作关系与线程同步 线程间的协作关系 多个线程共同完成一个任务而分工协作,但是每个线程都是独立的速度在执行,需要在某些特定的协调点上实现线程之间的同步。 【例7.7】 发送线程与接收线程。 例子分析: 发送线程向buffer里面存数据,接收线程从buffer里面去数据 理想情况是:发送线程存一个,接收线程取一个 实际情况:由于两个线程是独立运行,步调不一定一致。 解决思路:发送线程存完数据后,通知接收线程来取;接收线程取完数据后通知发送线程可以继续存数据。 * 线程间的协作关系: 当一个进程中多个线程分工协作完成同一任务时,它们之间彼此有联系,而且受其他线程执行结果的影响。这些线程之间有直接制约关系。 由于各个线程都是独立以不可预知的速度推进,需要协作的线程必须在某些事先设置的协调点上协调各自的工作。 当某个线程到达协调点,而其他线程还未到达时,其需要阻塞自己,直到其他合作线程发来协调信号后方被唤醒继续执行。 * 线程同步是解决线程协作关系的手段。 线程互斥(存取款的例子)是线程同步的特殊例子。即逐次使用互斥共享资源。 2. 线程同步 * 3. 线程同步机制 线程同步机制 设置信号 为共享变量(协调点变量)约定一个信号
文档评论(0)