下面这段程序中,Object不用static 修饰时不会产生死锁,加上static就会产生死锁,为什么会这样呢?
public class TestDeadLock implements Runnable{
static Object o1 = new Object(); //在Object前面加static与不加对synchronized有什么影响,为什么执行结果不一样
static Object o2 = new Object(); //synchronized参数都可以是什么
public int flag = 0;
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(){
System.out.println("flag="+flag);
if(flag==0){
synchronized(o1){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(o2){
System.out.println("hello");
}
}
}
if(flag==1){
synchronized(o2){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(o1){
System.out.println("ok");
}
}
}
}
}
你在锁定o1的代码块内锁定o2,在锁定o2的代码块内锁定o1
因此,如果两个线程并发各自锁住了o1 o2,并且试图去锁对方,那么程序死锁而不加static,每个线程有一个自己的实例,锁的不是同一个o1 o2
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。