Java多线程中死锁问题演示
package deadlock;
public class TestDeadLock {
public static void main(String[] args) {
new TestDeadLock().startUp();
}
public void startUp(){
MyThread mt = new MyThread();
new Thread(mt,"张三A").start();
new Thread(mt,"李四B").start();
}
private class MyThread implements Runnable {
private Object key1 = new Object();
private Object key2 = new Object();
private boolean falg = true;//设置一个判断
public void run() {
if(falg){
//当进入判断后,改变falg值,下次进入时进入else语句
falg = false;
synchronized(key1){
System.out.println(Thread.currentThread().getName()+":key1");
try {
//出现休息时,执行另一个线程
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//另一个线程已经获得了key2这个钥匙,程序到此出现死锁
synchronized(key2){
System.out.println(Thread.currentThread().getName()+":key2");
}
}
}else{
falg = true;
synchronized(key2){
System.out.println(Thread.currentThread().getName()+":key2");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(key1){
System.out.println(Thread.currentThread().getName()+":key1");
}
}
}
}
}
}
当使用多重synchronized语句时,可能还会出现死锁的情况,需要特别注意别让程序死锁,上面的语句执行时,类似。张三A找到key1的钥匙,打开A门,然后想得到key2钥匙打开B门,但此时key2钥匙已经被李四B得到了,同时在同步中,也不能退出,程序出现死锁。