下面是实现这个图的代码:
public class TestLock implements Runnable{
/**
* @param args
*/
public int flag;
public static Object o1 = new Object(),o2=new Object();//有两个对象//这个地方的值是公共代码区的值,如果去掉static就不会出现死锁了!
public static void main(String[] args) {
TestLock tl1 = new TestLock();
TestLock tl2 = new TestLock();
tl1.flag=1;
tl2.flag=0;
Thread t1 = new Thread(tl1);//线程1
Thread t2 = new Thread(tl2);//线程2
t1.start();//线程1执行时,锁定对象2这个资源,等锁定对象1后解锁
t2.start();//线程2执行时,锁定对象1这个资源,等锁定对象2后解锁
}
@Override
public void run() {
if(flag == 0){
synchronized(o1){
System.out.println("o1 lock");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o2){
System.out.println("o2 lock");
}
}
}
if(flag==1){
synchronized(o2){
System.out.println("lock o2");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(o1){
System.out.println("lock o1");
}
}
}
}
}