死鎖示例
由于兩個鎖對象lock1,lock2是static只存在一份,導致兩個線程執行時會相互等待已經被獲得的瑣對象,導致死鎖產生.
如果將static去掉,2個鎖對象就是線程獨有的變量,不會被別的線程發現,因此不會產生死鎖.
public class DeadLock implements Runnable{
private String tag;
private static Object lock1 = new Object();
private static Object lock2 = new Object();
public void setTag(String tag){
this.tag = tag;
}
@Override
public void run() {
if(tag.equals("a")){
synchronized (lock1) {
try {
System.out.println("當前線程 : " + Thread.currentThread().getName() + " 進入lock1執行");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("當前線程 : " + Thread.currentThread().getName() + " 進入lock2執行");
}
}
}
if(tag.equals("b")){
synchronized (lock2) {
try {
System.out.println("當前線程 : " + Thread.currentThread().getName() + " 進入lock2執行");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("當前線程 : " + Thread.currentThread().getName() + " 進入lock1執行");
}
}
}
}
public static void main(String[] args) {
DeadLock d1 = new DeadLock();
d1.setTag("a");
DeadLock d2 = new DeadLock();
d2.setTag("b");
Thread t1 = new Thread(d1, "t1");
Thread t2 = new Thread(d2, "t2");
t1.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
}