java 中多线程死锁问题

IT痴者 2012-04-15 09:12:33
这个程序为什么不能实现死锁????????????




class Dead implements Runnable
{
private boolean flag;
Dead(boolean falg)
{
this.flag = flag;
}
public void run()
{
if (flag)
{
while (true)
{
synchronized(Locks.obj1)
{
System.out.println("if 1 启动!");
synchronized(Locks.obj2)
{
System.out.println("if 2 启动!");
}
}
}
}
else
{
while (true)
{
synchronized(Locks.obj2)
{
System.out.println("else 2 启动!");
synchronized(Locks.obj1)
{
System.out.println("else 1 启动!");
}
}
}
}
}

}

class Locks//定义锁对象
{
static Object obj1 = new Object();
static Object obj2 = new Object();
}

class DeadLock
{
public static void main(String[] args)
{
Thread t1 = new Thread(new Dead(true));
Thread t2 = new Thread(new Dead(false));

t1.start();
t2.start();

}
}
...全文
82 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤雨 2012-04-15
  • 打赏
  • 举报
回复
Dead(boolean falg)
{
this.flag = flag;
}

主要还是你不太小心了,这块有点小错误,应该都是flag。这样创建对象调用构造方法时值没有传就去,所以就是其boolean的默认值false。导致没法得到自己想要的结果,加油。
周靖峰 2012-04-15
  • 打赏
  • 举报
回复
因为Dead(flag)写错了


class Dead implements Runnable
{
private boolean flag;

Dead(boolean flag) //你写成falg了
{
this.flag = flag;
}

public void run()
{
if (flag)
{
while (true)
{
synchronized(Locks.obj1)
{
System.out.println("if 1 启动!");
synchronized(Locks.obj2)
{
System.out.println("if 2 启动!");
}
}
}
}
else
{
while (true)
{
synchronized(Locks.obj2)
{
System.out.println("else 2 启动!");
synchronized(Locks.obj1)
{
System.out.println("else 1 启动!");
}
}
}
}
}

}

class Locks//定义锁对象
{
static Object obj1 = new Object();
static Object obj2 = new Object();
}

class DeadLock
{
public static void main(String[] args)
{
Thread t1 = new Thread(new Dead(true));
Thread t2 = new Thread(new Dead(false));

t1.start();
t2.start();

}
}
枫叶红了 2012-04-15
  • 打赏
  • 举报
回复
找个视频看看吧,代码的问题还得自己去理解,梳理思路
IT痴者 2012-04-15
  • 打赏
  • 举报
回复


class Dead implements Runnable
{
private boolean flag;
Dead(boolean falg)
{
this.flag = flag;
}
public void run()
{
if (flag)
{
while (true)
{
synchronized(Locks.obj1)
{
System.out.println("if 1 启动!");
synchronized(Locks.obj2)
{
System.out.println("if 2 启动!");
}
}
}
}
else
{
while (true)
{
synchronized(Locks.obj2)
{
System.out.println("else 2 启动!");
synchronized(Locks.obj1)
{
System.out.println("else 1 启动!");
}
}
}
}
}

}

class Locks//定义锁对象
{
static Object obj1 = new Object();
static Object obj2 = new Object();
}

class DeadLock
{
public static void main(String[] args)
{
Thread t1 = new Thread(new Dead(true));
Thread t2 = new Thread(new Dead(false));

t1.start();
t2.start();

}
}

IT痴者 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

this.flag = flag;这里的flag都是指字段flag,逻辑上有问题,但语法上没问题
[/Quote]
似乎明白了
谢谢啊
IT痴者 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

因为Dead(flag)写错了

Java code

class Dead implements Runnable
{
private boolean flag;

Dead(boolean flag) //你写成falg了
{
this.flag = flag;
}

public void run()
……
[/Quote]

哈哈 可以了
谢谢啦、、、
为什么编译可以通过呢?????
cstur4 2012-04-15
  • 打赏
  • 举报
回复
this.flag = flag;这里的flag都是指字段flag,逻辑上有问题,但语法上没问题
IT痴者 2012-04-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

因为Dead(flag)写错了

Java code

class Dead implements Runnable
{
private boolean flag;

Dead(boolean flag) //你写成falg了
{
this.flag = flag;
}

public void run()
……
[/Quote]
那为啥编译成功了呢???

62,614

社区成员

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

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