网站大量收购闲置独家精品文档,联系QQ:2885784924

线程进程安全.pptVIP

  1. 1、本文档共44页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线程进程安全

3.4.2 案例分析 以Java语言为例,死锁一般来源于代码段的同步,当一段同步代码被某线程运行时,其他线程可能进入堵塞状态(无法抢占CPU),而刚好在该线程中,访问了某个对象,此时,除非同步锁定被解除,否则其他线程就不能访问那个对象。这可以称为“线程正在等待一个对象资源”。如果出现一种极端情况,一个线程等候另一个对象,而另一个对象又在等候下一个对象,以此类推。这个“ 等候链”如果进入封闭状态,也就是说,最后那个对象等候的是第一个对象,此时,所有线程都会陷入无休止的相互等待状态,造成死锁。尽管这种情况并非经常出现,但一旦碰到,程序的调试将变得异常艰难。 在这里给出一个死锁的案例,如代码P03_10.java 这段程序也貌似没有问题。但是和上一节的例子一样,它也是很不安全的,这种不安全性也很难发现。 观察run()函数中的代码,当th1运行后,进入代码段1,锁定了S1,如果此时th2运行,抢占CPU,进入代码段3,锁定S2,那么th1就无法运行代码段2,但是又没有释放S1,此时,th2也就不能运行代码段4。造成互相等待。为了模拟这个过程,我们在程序中增加让其休眠的代码,好让另一个线程来抢占CPU。将P03_10.java的代码改为P03_11.java 该代码中,增加了一行:程序休眠1000毫秒,让另一个线程来抢占CPU。运行,控制台打印如下: 两个线程陷入无休止的等待。其原因是,线程th1进入代码段1后,线程2抢占CPU,锁定了S2,而线程th1对S1的锁定又没有解除,造成线程th2无法运行下去,当然,由于线程th2锁定了S2,线程th1也无法运行下去。 死锁是一个很重要的问题,它能导致整个应用程序慢慢终止,尤其是当开发人员不熟悉如何分析死锁环境的时候,还很难被分离和修复。 3.4.3 解决方案 就语言本身来说,尚未直接提供防止死锁的帮助措施,需要我们通过谨慎的设计来避免。一般情况下,我们主要是针对死锁产生的四个必要条件来进行破坏,用以避免和预防死锁。在系统设计、线程开发等方面,注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免线程永久占据系统资源。 以Java为例,Java并不提供对死锁的检测机制。但可以通过java thread dump来进行判断:一般情况下,当死锁发生时,Java虚拟机处于挂起状态,thread dump可以给出静态稳定的信息,从操作系统上观察,虚拟机的CPU占用率为零,这时可以收集thread dump,查找waiting for monitor entry的线程,如果大量thread都在等待给同一个地址上锁,说明很可能死锁发生了。 解决死锁没有简单的方法,这是因为线程产生死锁都各有各的原因,而且往往具有很高的负载。从技术上讲,可以用如下方法来进行死锁排除: 可以撤消陷于死锁的全部线程。 可以逐个撤消陷于死锁的进程,直到死锁不存在。 从陷于死锁的线程中逐个强迫放弃所占用的资源,直至死锁消失。 提示: 关于死锁的检测与解除,有很多重要算法,如资源分配算法、银行家算法等。在操作系统的一些参考资料中应该可以进行足够了解。 很多软件产品内置了死锁解决策略,可做参考。如: 数据库死锁。一个连接占用了另一个连接所需的数据库锁,它可能阻塞另一个连接。如果两个或两个以上的连接相互阻塞,产生死锁。该情况下,一般会强制销毁一个连接(通常是使用最少的连接),并回滚其事务。这将释放所有与已经结束的事务相关联的锁,至少允许其他连接中有一个可以获取它们正在被阻塞的锁。 资源池耗尽死锁。资源池太小,而每个线程需要的资源超过了池中的可用资源,产生死锁。此时可以增加连接池的大小或者重构代码,以便单个线程不需要同时使用很多资源。 3.5 线程控制安全 3.5.1 安全隐患 线程控制主要是对线程生命周期的一些操作,如暂停、继续、消亡等。本节以Java语言为例,讲解线程控制中的一些安全问题。Java中提供了对线程生命周期进行控制的函数: stop():停止线程; suspend():暂停线程的运行; resume():继续线程的运行: destroy():让线程销毁;等等。 线程生命周期中的安全问题主要体现在: 线程暂停或者终止时,可能对某些资源的锁并没有释放,它所保持的任何资源都会保持锁定状态; 线程暂停之后,我们无法预计它什么时候会继续(一般和用户操作有关),如果对某个资源的锁长期被保持,其他线程在任何时候都无法再次访问该资源,极有可能造成死锁。 针对这个问题,为减少出现死锁的可能,Java 1.2中,将Thread的stop(),suspend(),resume()以及destroy()方法定义为“已过时”方法,不再推荐使用。 3.5.2 案例分析 如前所述,线程的暂停和继续,早期采用su

文档评论(0)

zsmfjh + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档