黑马程序员技术交流社区

标题: 线程死锁和线程阻塞的区别 [打印本页]

作者: 琚臻臻    时间: 2011-7-18 17:04
标题: 线程死锁和线程阻塞的区别
我明白阻塞不是死锁,但是具体区别不是很明白!
作者: 崔虎    时间: 2011-7-18 17:25
线程的死锁和阻塞共同点:线程都是处于等待状态。
不同点:
|-  常见的 造成阻塞的原因有:
        |-  线程自己调用了sleep()方法 进行睡眠。
        |-  线程自己调用了wait()方法 进行等待。
        |-  线程等待用户输入或输出操作时 同样会阻塞。
|-  相应的解决方法有:
        |-  等待睡眠时间结束 或其他线程调用interrupt()方法将其唤醒。
        |-  等待它等待的时间结束  或其他线程调用notify()、notifyAll()将其唤醒。
        |-  等待用户输入或输出结束。

关于死锁:说白了就是:You first,You first问题。
双方谁都不愿意先做,导致最终相互等待。
比如说:
  •  抢劫犯要求: 你们先给我钱,我放人。
  •  受害者家属要求: 你先放人,我们给你钱。

最终结果就是 相互僵持着。

换句话说,阻塞是由于 “程序的需要”,才产生的。而死锁则是由于,“临界资源不足”造成的。
所谓的临界资源,即“同一时间只允许一个线程占有的资源,其他线程必须等待该线程放弃该资源后,才可以使用该资源”。
因此,死锁产生的原因:
|-  线程A占有一个临界资源,线程B也占有一个临界资源。
|-  A和B都不想放弃自己的资源,同时又想占有对方的资源。然后就互相等待,等待对方先放弃资源。
[ 本帖最后由 cxy_zy 于 2011-07-18  17:27 编辑 ]




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2