java死锁造成的原因

戴帽子的鼠 2013-08-23 05:47:23
class Obj{
static Object obj1=new Object();
static Object obj2=new Object();
}
class Sisuo implements Runnable{
boolean flag=true;
public Sisuo(boolean flag){
this.flag=flag;
}
public void run(){
if(flag)
synchronized (Obj.obj1) {//死锁造成的原因是不是因为,一个synchronized拿着obj1变量,另一个synchronized拿着另一个拿着 obj2,这两个都想要对方的变量,可是变量已经在使用,
System.out.println("obj1----if");
synchronized (Obj.obj2) {
try {
Thread.sleep(10);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("obj2----if");
}
}
else
synchronized (Obj.obj2) {
System.out.println("obj2----else");
synchronized (Obj.obj1) {
try {
Thread.sleep(10);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("obj1----else");
}
}
}
}
class Test{
public static void main(String[] args){
//Sisuo xiaosi=new Sisuo();
Thread t1=new Thread(new Sisuo(true));
Thread t2=new Thread(new Sisuo(false));
t1.start();
//Sisuo.flag=false;
t2.start();
}
}


死锁造成的原因是不是因为,一个synchronized拿着obj1变量,另一个synchronized拿着另一个拿着 obj2,这两个都想要对方的变量,可是对方变量已经在使用,导致另一个线程无法操作?。关键在于变量已经使用?
...全文
242 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
小葫芦 2013-08-24
  • 打赏
  • 举报
回复
引用
是的。两个线程都要等待对方所拥有的变量的锁,又得不到。死锁了。

正解
wind_elf 2013-08-23
  • 打赏
  • 举报
回复
是的。两个线程都要等待对方所拥有的变量的锁,又得不到。死锁了。
2013-08-23
  • 打赏
  • 举报
回复
恩。你得到一份东西,需要等待一份东西,才能完成任务。 等待的东西,别人正在使用。你不得到,就不能将手中的物品释放。 对面和你出现同样的情况。 AB BA 都可以完成任务。 A---->need B B---->need A 死锁了。
末日哥 2013-08-23
  • 打赏
  • 举报
回复

62,614

社区成员

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

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