1. 程式人生 > >模擬死鎖

模擬死鎖

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(); } }

模擬死鎖