[求助]这个程序怎么不会出现死锁?

Steve_Samuelson 2008-04-23 08:48:23

public class $03_DeadLock {
public static void main(String[] args) {
Demo demo1 = new Demo(1);
Demo demo2 = new Demo(0);
Thread t1 = new Thread(demo1);
Thread t2 = new Thread(demo2);
t1.start();
t2.start();
}
}

class Demo implements Runnable{
public int flag = 0;
static Object o1 = new Object();
static Object o2 = new Object();
Demo(int flag){
this.flag=flag;
}
public void run() {
// TODO Auto-generated method stub
System.out.println("flag="+flag);
if(flag==1){
synchronized (o1) {
System.out.println(Thread.currentThread().getName()+"持有o1的锁");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
synchronized (o2) {
System.out.println("执行完了!");
}
}
if(flag==0){
synchronized (o2) {
System.out.println(Thread.currentThread().getName()+"持有o2的锁");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
synchronized (o1) {
System.out.println("执行完了!");
}
}
}
}

...全文
59 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Steve_Samuelson 2008-04-23
  • 打赏
  • 举报
回复
恩 非常感谢!明白了!
看来死锁只能出现在synchronized的嵌套问题上了,是吗?
lpingxh 2008-04-23
  • 打赏
  • 举报
回复
你sleep完之后就释放掉了o1,这样相当于我们两个交换了一个苹果,当然没有问题。
如果我们都想在给对方苹果之前还想拿到你手中的苹果,那肯定有问题了
mc_escher 2008-04-23
  • 打赏
  • 举报
回复
8会
Steve_Samuelson 2008-04-23
  • 打赏
  • 举报
回复
我不是很理解?可以解释下吗?
我原来把锁分开时,为什么不可以?
第一个线程先进就拿了O1锁,然后让给线程2执行,线程2自然拿了O2锁
这时已经出现了互相需要对方的锁才能执行啊,怎么不会发生死锁的?
什么地方理解有偏差呢?
lpingxh 2008-04-23
  • 打赏
  • 举报
回复
public class cc {
public static void main(String[] args) {
Demo demo1 = new Demo(1);
Demo demo2 = new Demo(0);
Thread t1 = new Thread(demo1);
Thread t2 = new Thread(demo2);
t1.start();
t2.start();
}
}

class Demo implements Runnable {
public int flag = 0;
static Object o1 = new Object();
static Object o2 = new Object();

Demo(int flag) {
this.flag = flag;
}

public void run() {
// TODO Auto-generated method stub
System.out.println("flag=" + flag);
if (flag == 1) {
synchronized (o1) {
System.out.println(Thread.currentThread().getName() + "持有o1的锁");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (o2) {
System.out.println("执行完了!");
}
}
}
if (flag == 0) {
synchronized (o2) {
System.out.println(Thread.currentThread().getName() + "持有o2的锁");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

synchronized (o1) {
System.out.println("执行完了!");
}
}
}
}
}

你用这个试试,把第二个锁放到第一个里面才会死锁
Steve_Samuelson 2008-04-23
  • 打赏
  • 举报
回复
怎么死锁?教教我呢!
lpingxh 2008-04-23
  • 打赏
  • 举报
回复
这肯定不会死锁嘛。。。

62,623

社区成员

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

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