zoukankan      html  css  js  c++  java
  • 线程原理篇——>第9章 死锁应对之哲学原理

    第9章 死锁应对之哲学原理

    9.1 为什么会发生死锁

    死锁的发生,归根结底是因为对资源的竞争。

    9.2 死锁的描述

    死锁的定义:如果有一组线程,每个线程都在等待一个事件的发生,而这个事件只能由该组线程里面的另一线程发生,则我们称这组线程发生了死锁。这里的事件通常是资源的释放。

     

    如果A和B交替执行,A首先执行,获得锁x,然后B执行,获得锁y;但在B试图获得锁x的时候将被拒绝(因为A持有x锁),因此将等待锁x;这个时候线程A再执行,视图获得锁y,因为y被B持有,A将等待y。至此,A和B皆不能够执行,也皆不能释放锁(因为已经等待另一把锁),从而赞成死锁。

    当然,并不一定会发生死锁。如果A先执行,获得x和y两把锁之后B再执行,则将不会 发生死锁。事实上,这种情况发生死锁的可能性远低于不发生死锁的可能。

    9.3 死锁的4个必要条件

    互斥条件;请求和保持条件;不剥夺条件;环路等待条件

    条件1:资源有限。即一个系统里面的资源数量有限,以致无法同时满足所有线程的资源需求。

    条件2:持有等待。即一个线程在请求新的资源时,其已经获得的资源并不释放,而是继续持有。

    条件3:不能抢占。如果可以抢占一个资源,也不会发生死锁。

    条件4:循环等待。如果你等我、我等你,大家都这样等着对方,就产生了死锁。

    9.4 哲学家就餐问题

    9.5 死锁的应对

    第1种方式(解除死锁):假装没有看见,不予理睬,也就是任由死锁发生;windows、linux等商业操作系统通常采用这种方式。

    第2种方式(检测死锁):在死锁发生后,想办法予以解决。高可靠性系统、实时系统采用这种方式。

    第3种方式(避免死锁):在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生。缺点:实现困难,设计实现和时间成本上都不理想。

    第4种方式(预防死锁):通过将发生死锁的必要条件消除,杜绝死锁的发生,死锁的静态防止。

    9.6 消除死锁的必要条件

    第1种方式:消除资源独占条件。通过资源共享来实现。

    第2种方式:消除保持和请求条件。

    方法一:一个线程必须一次请求其所需要的所有资源,而不是一般情况下的请求一点资源,做一点事情;到需要下一个资源的时候再请求,获得资源后再继续推进。由于一个线程一次就获得了其所需要的所有资源,该线程自然就可以顺利执行,从而不会发生死锁。这种办法的缺点的一个问题是一次将所有资源拿齐,太过浪费;另一个问题是一个线程一开始就需要知道所需要的所有资源,这是很困难的。

    方法二:在需要资源的时候才请求,但加上一个条件:如果请求的资源被拒绝,则该线程需将其现在已经拥有的资源也释放掉。缺点:在获得某个资源失败后,需要释放已经占用的所有资源,而这可能造成问题。例如,如果一个线程已经获得一些锁,但在锁里的工作又没有做完。如果这时释放锁,很可能造成前功尽弃,从而造成浪费。

    第3种方式:允许抢占资源,也就是说可以从一个线程手中将资源抢夺过来。局限性:不是所有的资源都可以被抢占而不产生不良后果。例如,锁。

    第4种方式:消除循环等待条件,即顺序请求资源。典型例子:锁的使用。

    9.7 银行家算法:冒险的代价

    9.8 哲学家就餐问题之解

    9.9 讨论:死锁的思考——综合治理

    9.10 讨论:死锁、活锁与饥饿

    思考题(面试题)

    https://blog.csdn.net/wljliujuan/article/details/79614019

  • 相关阅读:
    target runtime apache v6.0 not defined解决
    java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
    The valid characters are defined in RFC 7230 and RFC 3986问题
    invalid END header解决方法
    You have more than one version of ‘org.apache.commons.logging.Log’ visible, which is not allowed问题解决
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    在eclipse中import java web项目时遇到的一些问题并将该项目通过tomcat发布
    java byte转string 涉及到字节流中有中文
    spring+mybatis框架搭建时遇到Mapped Statements collection does not contain value for...的错误
    试试看读一下Zepto源码
  • 原文地址:https://www.cnblogs.com/lanyuejiagou/p/12606064.html
Copyright © 2011-2022 走看看