创造一个线程死锁事件。
稍微想一下应该很简单, 只需在执行一个同步方法1时, 里面需要执行另一个同步方法2, 而另一个线程恰好需要先执行2再执行1 ,两个就锁住了。
需要注意的是:
这两个同步方法需要嵌套关系,而不是并列关系。 因为后者在完成第一个同步方法时,第一个方法的锁就打开了,达不到循环等待的效果。
另外在接口里使用flag 变量来控制线程先执行哪个同步方法, 因为两个线程是分别使用两个接口, 所以被锁定的Object对象一定要是static的。
代码示例:
package thread;
public class DeadLock implements Runnable{
public int flag=1;
public static Object o1=new Object();
public static Object o2=new Object();
public void run(){
System.out.println(flag);
if(flag==1){
synchronized(o1){
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
synchronized(o2){
System.out.println("1");
}
}
}
if(flag==0){
synchronized(o2){
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
synchronized(o1){
System.out.println("0");
}
}
}
}
public static void main(String[] args){
DeadLock deadlock1=new DeadLock();
DeadLock deadlock2=new DeadLock();
deadlock1.flag=1;
deadlock2.flag=0;
Thread t1=new Thread(deadlock1);
Thread t2=new Thread(deadlock2);
t1.start();
t2.start();
}
}