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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM周磊 中级黑马   /  2013-3-16 11:02  /  1830 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM周磊 于 2013-3-16 18:19 编辑

哪位大神可以详细解说一下吗??

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-16 13:02

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。死锁产生有四个必要的条件:互斥条件,不可剥夺条件,部分分配,循环等待,这四个条件不是充分条件,即使这四个条件同时存在,系统也不一定发生死锁,但系统一但发生死锁,这四个条件一定是满足的。
死锁产生的必要条件是:
① 互斥条件:系统中存在一个资源一次只能被一个进程所使用;
  ② 非抢占条件:系统中存在一个资源仅能被占有它的进程所释放,而不能被别的进程强行抢占。
  ③ 占有并等待条件:系统中存在一个进程已占有了分给它的资源,但仍然等待其他资源。
  ④ 循环等待条件:在系统中存在一个由若干进程形成的环形请求链,其中的每一个进程均占有若干种资源中的某一种,同时每个进程还要求(链上)下一个进程所占有的资源。


http://bbs.itheima.com/thread-2453-1-1.html
http://bbs.itheima.com/thread-32333-1-1.html
这是本站的两个贴子 希望也会对你有所帮助

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我不是大神,详细我也说不出来,我就简单说一种情况吧
假如锁a中嵌套了另一个锁b,那么线程1就要先进a,然后进b
但是如果另一段代码中,是锁b中嵌套了锁a,那么第二个线程就要先进入b,再进入a
  1. a
  2. {
  3.     //一段代码
  4.      b
  5.      {
  6.             //一段代码
  7.      }
  8. }


  9. b
  10. {
  11.       //另一段代码
  12.      a
  13.      {
  14.             //另一段代码
  15.      }
  16. }
复制代码
如果线程1进入了a锁,准备进入b的时候,切换到了线程2执行,线程2跑去执行了另一段代码,进入了b锁,那么b锁就被线程2拿到了,那么第一段代码中的线程1再次执行的时候就没法进入嵌套中的b锁了,而线程2也没法进入另一段代码中的a锁,大家就死在这里化成灰了。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
死锁是的:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
  1. class Deadlocker {
  2. int field_1;
  3. private Object lock_1 = new int[1];
  4. int field_2;
  5. private Object lock_2 = new int[1];

  6. public void method1(int value) {
  7.   “synchronized” (lock_1) {
  8.    “synchronized” (lock_2) {
  9.     field_1 = 0; field_2 = 0;
  10.    }
  11.   }
  12. }

  13. public void method2(int value) {
  14.   “synchronized” (lock_2) {
  15.    “synchronized” (lock_1) {
  16.     field_1 = 0; field_2 = 0;
  17.    }
  18.   }
  19. }
  20. }
复制代码
以上代码是一个 导致死锁的例子。
是不恰当调用“synchronized”这个关键词导致的。。
“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
两个线程A和B。
如果A想调用的资源被B掌握着不放,A就会一直等B释放资源后再运行
B想调用的资源被A掌握着不放,B就会一直等A释放资源后再运行

死锁就是:当A和B分别掌握了对方的资源不放,程序僵持到了这里,就成了死锁。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
blackcaismine 发表于 2013-3-16 11:16
我不是大神,详细我也说不出来,我就简单说一种情况吧
假如锁a中嵌套了另一个锁b,那么线程1就要先进a,然 ...

:victory:还有什么情况呢???
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马