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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 符乃夫 中级黑马   /  2013-12-22 00:15  /  1138 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 符乃夫 于 2013-12-25 10:56 编辑

什么情况下产生死锁?如果解决? 怎么避免产生死锁?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
在同步嵌套同步的时候容易发生。
这么说吧,有两个人吃饭,每个人给了一只筷子,
他俩都想要对方的,让自己先吃,结果都饿死了。
解决把法就是 只给一双筷子,一人吃完在给另一个人。

评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 淡定

查看全部评分

回复 使用道具 举报
楼上比喻不错,再打个比方:火车上上厕所,一个人进去后,后面的人就要排队等,厕所人出来后,门就开了,下一个人就可以进人.如果所有人都一涌而上,都上不成厕所,这就成了死锁,都挤在门口出不来,进不去.
死锁实例:
  1. class Ticket implements Runnable {
  2.         boolean flag = true;

  3.         Ticket(boolean flag) {
  4.                 this.flag = flag;
  5.         }
  6.         /*
  7.          * 分析:
  8.          * 假设a先线程进入了if(),打开了locka锁,输出了...if....a
  9.          * 这时b也进入了else,打开了lockb锁.输出了...if....b
  10.          * 这时a想打开lockb锁,可是else中b持有着,所以a还打不开,就在这里等着b走完else将lockb锁释放
  11.          * 这时b需要打开locka锁,走出else才能释放lockb锁,但是a在if中持有着locka锁,b也打不开,也在这等待着a走完if将locka锁释放
  12.          * 最终都停在这里出不去,这就是死锁
  13.          * 如何解决:
  14.          * 首先找到问题的所在,让他们共用的锁在释放后,才允许下一个线程持有这个锁,这个还是主要分析具体的情况,这代码就是一个死锁的代码示例
  15.          * */

  16.         public void run() {
  17.                 if (flag) {
  18.                         synchronized (Mylock.locka) {
  19.                                 System.out.println(Thread.currentThread().getName()
  20.                                                 + "...if....a");
  21.                                 synchronized (Mylock.lockb) {
  22.                                         System.out.println(Thread.currentThread().getName()
  23.                                                         + "...if....b");
  24.                                 }
  25.                         }
  26.                 } else {
  27.                         synchronized (Mylock.lockb) {
  28.                                 System.out.println(Thread.currentThread().getName()
  29.                                                 + "...else....a");
  30.                                 synchronized (Mylock.locka) {
  31.                                         System.out.println(Thread.currentThread().getName()
  32.                                                         + "...else....b");
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37. }

  38. class Mylock {
  39.         public static final Object locka = new Object(); //locka用于线程a的锁
  40.         public static final Object lockb = new Object(); //lockb用于线程b的锁
  41. }

  42. public class Test1 {
  43.         public static void main(String[] args) throws InterruptedException {
  44.                 Ticket a = new Ticket(true);  //让a走if语句
  45.                 Ticket b = new Ticket(false);//让b走else语句
  46.                 Thread t1 = new Thread(a);
  47.                 Thread t2 = new Thread(b);
  48.                 t1.start();  //开启线程
  49.                 t2.start();
  50.         }
  51. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

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