线程死锁问题源码不理解,请高手帮忙

skyearthsea 2008-07-09 07:42:09

public class DeadLock implements Runnable {

private boolean flag;

static Object o1 = new Object(), o2 = new Object();

public void run() {
System.out.println(flag);
if (flag) {
synchronized (o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("AAA");
}
}

} else {
synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("BBB");
}
}

}

}

public static void main(String[] args) {
DeadLock aaa = new DeadLock();
DeadLock bbb = new DeadLock();
aaa.flag = true;
bbb.flag = false;
Thread thA = new Thread(aaa);
Thread thB = new Thread(bbb);
thA.start();
thB.start();
}
}

为什么要执行Thread.sleep(500);不执行它不好用,为什么呢不明白,请高手讲解
...全文
99 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wensheng_zh2007 2008-07-10
  • 打赏
  • 举报
回复
首先你想要死锁,要给予每个线程拿到自己首先要拿到的对象的机会。
sleep就是 给B机会了
否则可能在执行线程A的时间片的时候,它就把两个对象都给拿到了,那怎么能形成死锁?
skyearthsea 2008-07-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wensheng_zh2007 的回复:]
首先你想要死锁,要给予每个线程拿到自己首先要拿到的对象的机会。
sleep就是 给B机会了
否则可能在执行线程A的时间片的时候,它就把两个对象都给拿到了,那怎么能形成死锁?
[/Quote]
[Quote=引用 8 楼]
否则机器速度太快了,第二个线程还没执行,第一个已经结束了。 呵呵!
[/Quote]
箴言
老紫竹 2008-07-10
  • 打赏
  • 举报
回复
7楼正解。
否则机器速度太快了,第二个线程还没执行,第一个已经结束了。 呵呵!
xing1314 2008-07-09
  • 打赏
  • 举报
回复
由于o1,o2为static变量,无论你new多少个对象都只有一份。

两个线程同时对两个变量进行加锁,这样,很容易出现死锁。
巧乐之 2008-07-09
  • 打赏
  • 举报
回复
sleep(500)是要确保两个线程能同时死死咬住自己的资源。

上面的程序要演示的死锁情形是:

thA咬住了o1,同时thB咬住了o2

thA在咬住o1不松口的情况下,还等要o2
thB在咬住o2不松口的情况下,还想要o1

这样,两个线程都无休止的等待对方松口,从而都无法结束。

咬住的操作是由synchronize后面的代码块({}中的语句序列)实现的,synchronize代码块的执行期间,线程将咬住(锁定)synchronize语句中制定的对象。

sleep(500)保证了线程将咬住对象500毫秒以上。

可以这样想象执行序列:

1、a启动,咬住了o1后,暂停500毫秒;
2、b启动,咬住了o2,暂停500毫秒;
3、a完成了500毫秒暂停,尝试咬住o2,由于b没有松口(synchronize(o2)代码段没有退出),a等待b松口;
4、b的情形一样,等待a松口;

于是,两个线程无限等待下去,程序无法退出了。




jingulang 2008-07-09
  • 打赏
  • 举报
回复
晕 服务器怎么出问题了

白回复了
jingulang 2008-07-09
  • 打赏
  • 举报
回复


Thread.sleep(500); 其实就是找个时间差

目的就是让A线程执行到synchronized (o2) {
System.out.println("AAA");
}
的时候,
线程B执行到synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}

你设成Thread.sleep(50)或许也能造成死锁


tianlj202 2008-07-09
  • 打赏
  • 举报
回复
Thread thA = new Thread(aaa);
Thread thB = new Thread(bbb);
thA.start();
thB.start();

你的 thA.start();先执行,运行后结果都打印出来后才执行thB.start();
所以你的加锁是不影响的。
当你添加了Thread.sleep(500);thA.start();将对象锁住,等待时间结束,同时thB.start();也运行了也将也对象锁住
时间一到,两个线程同时运行时发现都在等待对方解锁。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧