模擬死鎖
阿新 • • 發佈:2018-05-30
ron ren nts except sleep ide public dex 模擬
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(); } }
模擬死鎖