序
死鎖在平時開發,尤其是多並發編程時是要避免,不過要自己刻意寫個死鎖還不一定容易,下面參考別人代碼寫一個
代碼
public class DeadLock implements Runnable{ private int flag = 1; private static final Object o1 = new Object(); private static final Object o2 = new Object(); public void setFlag(int flag) { this.flag = flag; } @Override public void run() { if (flag == 1) { synchronized (o1) { System.out.println(Thread.currentThread().getName() + " o1"); try { Thread.sleep(800); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2) { System.out.println(Thread.currentThread().getName() + " o2"); } } } if (flag == 2) { synchronized (o2) { System.out.println(Thread.currentThread().getName() + " o2"); try { Thread.sleep(800); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o1) { System.out.println(Thread.currentThread().getName() + " o1"); } } } } public static void main(String[] args) { DeadLock deadLock1 = new DeadLock(); DeadLock deadLock2 = new DeadLock(); deadLock1.setFlag(1); Thread thread1= new Thread(deadLock1, "Thread1"); thread1.start(); deadLock2.setFlag(2); Thread thread2= new Thread(deadLock2, "Thread2"); thread2.start(); } }
說明
o1、o2是static類型屬於整個累,所以當定義deadLock1、deadLock2時是公用o1、o2的
deadLock1設置flag=1,先鎖住o1,然后睡800ms,此時
deadLock2設置flag=2,先鎖住o2,然后睡800ms
然后deadLock1開始鎖o2,不過o2還被deadLock2鎖着,只好等待。。。
此時deadLock1開始鎖01,不過o1還被deadLock1鎖着,只好等待。。。
相互等待造成死鎖
結果
Thread1 o1
Thread2 o2