首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

一个死锁的小程序,请大家看看为什么不行。解决方法

2012-03-24 
一个死锁的小程序,请大家看看为什么不行。public class TestDeadLock implements Runnable{public int flag

一个死锁的小程序,请大家看看为什么不行。
public class TestDeadLock implements Runnable
{
public int flag=1;
static Object o1=new Object();
static Object o2=new Object();

public void run()
{

  if(flag==1){
synchronized (o1){
try
  {
Thread.sleep(100);
}
catch(Exception e){}
}
synchronized (o2)
  {
System.out.println("flag==1");
}
}

  if(flag==0){
synchronized (o2)
  {
try{
Thread.sleep(100);
}
catch(Exception e)
{}
}
synchronized (o1){
System.out.println("flag==2");
}
  }
}
public static void main(String[] args)
{
TestDeadLock te1=new TestDeadLock();
TestDeadLock te2=new TestDeadLock();
te1.flag=1;
te2.flag=0;
Thread t1 = new Thread(te1);
Thread t2 = new Thread(te2);
t1.start();
t2.start();
}
}
我是这么想的:t1线程先启动因为flag==1所以应该先锁住o1,睡眠。然后t2启动flag==2锁住o2,然后t1醒来,但o2被锁定。所以无法进入下面被锁定的代码块。同理t2也无法继续进行。
但我试着怎么最后可以打印出结果:flag==1
flag==2

[解决办法]
总感觉代码什么地方不对!!, 我想应该是没有达成死锁的条件, 先thread 1执行完后在等待o2时,已经跳出了o1的同步代码块,这时o1已经释放, 然后Thread2在等待o1时也跳出了o2的同步代码块,这样写是不会造成死锁的
[解决办法]
搞错了……

synchronized (o1){ synchronized (o2){ }}
synchronized (o2){ synchronized (o2){ }}

这样才可以

热点排行