简单的死锁为什么锁不住?

a88256730 2016-11-04 02:20:08
代码如下,死锁思路清晰明了,求教各位下面的死锁为什么会锁不住?
public class TestDeadLock {
public static void main(String[] args) {
new TestDeadLock().run();

}

public void run() {
Mythread mt = new Mythread();
Thread t1 = new Thread(mt, "t1");
Thread t2 = new Thread(mt, "t2");
t1.start();
t2.start();
}

class Mythread implements Runnable {
@Override
public void run() {
Object k1 = new Object();
Object k2 = new Object();
boolean flag = true;

if (flag) {
flag = false;
synchronized (k1) {
System.out.println(Thread.currentThread().getName() + ":k1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (k2) {
System.out.println(Thread.currentThread().getName() + ":k2");

}
}

} else {
flag = true;
synchronized (k2) {
System.out.println(Thread.currentThread().getName() + ":k2");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (k1) {
System.out.println(Thread.currentThread().getName() + ":k1");
}
}
}
}
}
}



多次输入结果分别为:


t1:k1
t2:k1
t2:k2
t1:k2


t1:k1
t2:k1
t1:k2
t2:k2


t2:k1
t1:k1
t2:k2
t1:k2


t2:k1
t1:k1
t1:k2
t2:k2
...全文
141 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
a88256730 2016-11-04
  • 打赏
  • 举报
回复
你讲的使对,感谢。 把k1,k2,flag设置为全局变量就OK了。疏忽了,谢啦。
luojims 2016-11-04
  • 打赏
  • 举报
回复
synchronized (value) { 这里的value就是判断是不是同一个锁,你那里每次调用都是new一个对象,所有的锁都不是同一个值,建议你先直接用固定值

62,616

社区成员

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

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