synchronized 來講,要模擬死鎖,網上確定不少例子,並且也比較實現。 但是 Lock 類 怎麼纔會死鎖呢? 怎麼用呢? 發現就比較少例子了。並且 好多代碼哦, 看起來 好難看挺亂的。 我就 本身 嘗試着實現,寫的時候還一度把我頭腦搞暈了,亂寫巧合 實現了,還算比較簡單。java
package com.mytest.code_right.sys_lock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Test6 { public static void main(String args[]) { // 線程死鎖 final A a = new A(); final B b = new B(); // 線程A new Thread(new Runnable() { public void run() { System.out.println("線程A開始執行"); a.a3(b); } }, "線程A").start(); // 線程B new Thread(new Runnable() { public void run() { System.out.println("線程B開始執行"); b.b3(a); } }, "線程B").start(); } // 資源A static class A { private final Lock lock = new ReentrantLock(); public void a2() { System.out.println("未加鎖進入a.a2()" + Thread.currentThread().getName()); lock.lock(); System.out.println("進入a.a2()"); lock.unlock(); } public void a3(B b) { System.out.println("進入a3開始鎖" + Thread.currentThread().getName()); lock.lock(); System.out.println("進入a3鎖" + Thread.currentThread().getName()); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("進入a3鎖>>開始執行b.b2" + Thread.currentThread().getName()); b.b2(); lock.unlock(); } } // 資源B static class B { private final Lock lock = new ReentrantLock(); public void b2() { System.out.println("未加鎖進入b.b2()" + Thread.currentThread().getName()); lock.lock(); System.out.println("進入 b.b2"); lock.unlock(); } public void b3(A a) { System.out.println("進入b3開始鎖" + Thread.currentThread().getName()); lock.lock(); System.out.println("進入b3鎖" + Thread.currentThread().getName()); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("進入b3鎖>>開始執行a.a2" + Thread.currentThread().getName()); a.a2(); lock.unlock(); } } }
其實以上的例子是參考多線程
編寫高質量代碼:改善Java程序的151個建議-秦小波線程
裏面的一些 Lock和synchronized 例子來 寫的。code
其實我寫出來的時候才發現本身對 Lock 理解不對, 看着代碼分析才理解了 書上的意思對象
這是由於對於同步資源來講(示例中是代碼塊),顯式鎖是對象級別的鎖,而內部鎖是類級別的鎖,也就是說Lock鎖是跟隨對象的,synchronized鎖是跟隨類的,更簡單地說把Lock定義爲多線程類的私有屬性是起不到資源互斥做用的,除非是把Lock定義爲全部線程的共享變量。
也就是說 Lock 是對象級別的鎖 ,會鎖着對象。資源
###代碼例子說明 上面的例子 死鎖的緣由是這樣: 線程B 鎖着 類B 而後想獲取 類A的方法鎖着並執行所以須要鎖着對象A , 線程A鎖着 類A ,想獲取類B的方法鎖着並執行所以須要鎖着對象B , 所以它們就會互相等待,死鎖了。 若是把上面的代碼 的 thread.sleep 時間去掉,執行多幾回,就會發現有時候是不會出現 線程死鎖的。 這就是 線程A 先執行完,而後到線程B 執行的不會等待了。get