线程死锁的质疑

郑文晓 2014-11-19 11:03:14
在网上搜到一篇线程死锁的博客,后来发现,两个线程并不会发生死锁。我的理由是
Thread thread01 = new Thread(run01);
Thread thread02 = new Thread(run02);
这两个线程构造函数传进来的参数Runnable对象run01,run02,会分别创建obj1、obj2,也就说两个线程通过synchronized(obj1)和synchronized(obj2)并不能实现互斥。[/color]
package cn.thread;
public class ThreadDieSock implements Runnable {
private int flag = 1;
private Object obj1 = new Object(), obj2 = new Object();

public void run() {
System.out.println("flag=" + flag);
if (flag == 1) {
synchronized (obj1) {
System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("1");
}
}
}
if (flag == 0) {
synchronized (obj2) {
System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println("0");
}
}
}
}

public static void main(String[] args) {
ThreadDieSock run01 = new ThreadDieSock();
ThreadDieSock run02 = new ThreadDieSock();
run01.flag = 1;
run02.flag = 0;
Thread thread01 = new Thread(run01);
Thread thread02 = new Thread(run02);
System.out.println("线程开始喽!");
thread01.start();
thread02.start();
}
}
...全文
234 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
meng020712 2014-11-20
  • 打赏
  • 举报
回复
你这个代码当然不会死锁、 锁住的都不是同一个对象。。
kainever 2014-11-20
  • 打赏
  • 举报
回复
Synchronized 是同一时刻只能有一个对象获得锁..... 你new 了两个 run , run01 , run02 , 这两个对象是完全不相干的 也就是run01里面的obj 和run02里面的 obj 根本就是两块内存.... 不相干的... 只要new一个ThreadDieSock对象 new两个Thread ... 把flag = -1-> static ....run 方法加一句 flag++; 可以了吧
Cactus_hxk 2014-11-19
  • 打赏
  • 举报
回复
你执行的结果是什么! System.out.println("1");和System.out.println("0");打印出来了吗!
skgary 2014-11-19
  • 打赏
  • 举报
回复
两个线程,两把锁就有可能会列锁,
yanxing2012 2014-11-19
  • 打赏
  • 举报
回复
死锁发生,是占用共同资源,不释放,实例变量每一个对象都有一个锁,静态变量整个类对象只有一个共同锁,会发生死锁
后飞的笨鸟儿 2014-11-19
  • 打赏
  • 举报
回复
楼主正确~
zapdos 2014-11-19
  • 打赏
  • 举报
回复
我只说一句:楼主说的没错 第二:这个博客贴代码居然没有通过测试,误人子弟
qq_23169513 2014-11-19
  • 打赏
  • 举报
回复
我也不懂求解
highnewrain 2014-11-19
  • 打赏
  • 举报
回复
按楼主贴的代码来说,肯定死锁不了的! 若楼主所看的博客的代码也确实如此,那估计是人家有可能是写漏了static了,这里的obj1 和obj2若设为static,这个代码就能死锁! 质疑并实践,学到的就是自己的,赞!
fengzhw 2014-11-19
  • 打赏
  • 举报
回复
那两个obj,搞成static就能模拟出来了。否则确实锁不上。 爱学习的人遇上烂书。。。

62,614

社区成员

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

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