用static 类加载的时候就会创建对象,所以r和r1用的是同一个锁,但是因为锁的顺序不一样,当t1线程进入锁里面(o1),那到第一个锁而没有进入第二个锁的时候,t2线程也运行了,而且也能进入到第一个锁里面(o2) 而当t2进入到第二个锁(o1)里面的时候里面有t1,所以就进不去,当t1要进入到第二个锁(o2)里面的时候,里面有t2 所以t1获取不到第二个锁所以会出现死锁!你可以把锁的顺序调一致。而不用static 的话,t1和t2用的都不是同一个锁 也就是t1的o1,o2和t2的o1,o2 是四个不同的对象!这样写加不加static都不会出现死锁
package cn.other.java.test;
public class Rescore implements Runnable {
int flag = 1;
static Object o1 = new Object() ,o2 = new Object(); //static Object o1 = new Object() ,o2 = new Object(); ,程序死锁,不用static程序可运行结束
public void run()
{
if(flag==1)
{
synchronized(o1)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o2)
{
for(int i = 0;i<10;i++)
{
System.out.println("flag=" + flag);
}
}
}
}
if(flag==0)
{
synchronized(o1)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o2)
{
for(int i = 0;i<10;i++)
{
System.out.println("flag=" + flag);
}
}
}
}
}
}
|