public class A { public void a() { System.out.println(Thread.currentThread().getName() + " in a."); } }
public class B { public void b() { System.out.println(Thread.currentThread().getName() + " in b."); } }
/** * 模擬死鎖 */ public class TestDeadLock { /* * 死鎖的解決辦法: * 對象的加鎖順序必定要一致,好比都是先加a的鎖,後加b的鎖. */ public static void main(String[] args) { // 兩個對象 A a = new A(); B b = new B(); /* * a和b的方法必須同步執行(例如A帳戶轉帳給B帳戶) * 因此a和b的方法執行以前,要要對a對象和b對象都加鎖 * * 模擬: * 線程1先給a加鎖,給b加鎖的時候失敗,等待線程2釋放b的鎖。 * 線程2先給b加鎖,給a加鎖的時候失敗,等待線程1釋放a的鎖。 */ // 線程1 new Thread(new Runnable() { @Override public void run() { // 先鎖a synchronized (a) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 1s後去鎖b synchronized (b) { a.a(); b.b(); } } System.out.println(Thread.currentThread().getName() + " done."); } }).start(); // 線程2 new Thread(new Runnable() { @Override public void run() { // 先鎖b synchronized (b) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 1s後去鎖a synchronized (a) { b.b(); a.a(); } } System.out.println(Thread.currentThread().getName() + " done."); } }).start(); } }