package Thread;
public class TestDeadLock implements Runnable{
int flag = 1;
static Object o1 = new Object();
static Object o2 = new Object();
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
public void run() {
if(flag == 1){
synchronized(o1){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o2){
System.out.println("t1 succeed");
}
}
}
if(flag == 0){
synchronized(o2){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o1){
System.out.println("t2 succeed");
}
}
}
}
}
按上述程序的结果是正确的 。但是如果我把static Object o1 = new Object();static Object o2 = new Object();前的static关键字都去掉的话则验证不出死锁。麻烦高手给讲解下原因 谢谢!
java死锁小程序
答案:2 悬赏:20
解决时间 2021-03-08 04:26
- 提问者网友:迷茫庸人
- 2021-03-07 11:39
最佳答案
- 二级知识专家网友:冷眼_看世界
- 2021-03-07 12:09
t1和t2两个线程,假设首先t1进入run()方法,然后判断flag是否为1,为1则利用对象o1将下面那段代码锁住,与此同时t2进入run()方法,判断flag,为0,则利用o2将下面那段代码锁住,再回过头来,此时t1继续向下执行,执行到synchronized(o2)这,此时o2对象已经被t2锁住,所以o1开始等待o2对象释放锁标记,同理,t2继续往下执行,执行到synchronized(o1)这,也就开始等待o1对象释放锁标记.这样互相等待,就产生死锁.
如果不static,那么它们两个线程都有自己的o1和o2,而不再是公用的了.
如果不static,那么它们两个线程都有自己的o1和o2,而不再是公用的了.
全部回答
- 1楼网友:单身小柠`猫♡
- 2021-03-07 12:20
不会,new deadthread(true)和new deadthread(false)没有什么关系。现象情况参见堆栈。
请勿尝试在可能会对性能造成不良影响的长时间操作(如i/o)中持有锁。
请勿在调用模块外且可能重进入模块的函数时持有锁。
一般情况下,请先使用粗粒度锁定方法,确定瓶颈,并在必要时添加细粒度锁定来缓解瓶颈。大多数锁定都是短期持有,而且很少出现争用。因此,请仅修复测得争用的那些锁定。
使用多个锁定时,通过确保所有线程都按相同的顺序获取锁定来避免死锁。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯