A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 琚臻臻 黑马帝   /  2011-7-18 17:04  /  4629 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我明白阻塞不是死锁,但是具体区别不是很明白!

评分

参与人数 1技术分 +1 收起 理由
admin + 1 这问题可以给分!

查看全部评分

1 个回复

倒序浏览
线程的死锁和阻塞共同点:线程都是处于等待状态。
不同点:
|-  常见的 造成阻塞的原因有:
        |-  线程自己调用了sleep()方法 进行睡眠。
        |-  线程自己调用了wait()方法 进行等待。
        |-  线程等待用户输入或输出操作时 同样会阻塞。
|-  相应的解决方法有:
        |-  等待睡眠时间结束 或其他线程调用interrupt()方法将其唤醒。
        |-  等待它等待的时间结束  或其他线程调用notify()、notifyAll()将其唤醒。
        |-  等待用户输入或输出结束。

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

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

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

评分

参与人数 1技术分 +2 收起 理由
admin + 2 这位同学答问题就是清晰,大家多学习

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马