死鎖實例java
進程A等待進程B發來的消息,進程B等待進程C發來的消息,而進程C又等待進程A發來的消息。消息未到,A,B,C三個進程均沒法向前推動,也會發生進程通訊上的死鎖this
死鎖:spa
死鎖是指多個線程循環等待其餘線程佔有的資源而無限期等待下去的狀況,沒有外力的狀況下是涉及到死鎖的各個線程將 一直處於死鎖狀態線程
產生死鎖的必要條件:code
1>.互斥條件:某個資源在一段時間內只能由一個進程佔有,不能被兩個或以上進程佔有進程
2>.不可搶佔:資源的申請者不能強行的從資源的佔有者手中奪取資源,只能由資源的佔有者自動釋放資源
3>.佔有申請條件:進程已經佔有一個資源,可是又申請新的資源,因爲該資源已經被進程佔有,此時該進程阻塞,可是他在等待新進程以前仍然佔有該資源get
4>.循環等待 4.死鎖示例:class
class Test implements Runnable { private boolean flag; Test(boolean flag) { this.flag = flag; } public void run() { if(flag) { while(true) { synchronized(MyLock.locka) { System.out.println(Thread.currentThread().getName()+"...if locka "); synchronized(MyLock.lockb) { System.out.println(Thread.currentThread().getName()+"..if lockb"); } } } } else //多個正在執行的線程 { while(true) { synchronized(MyLock.lockb) { System.out.println(Thread.currentThread().getName()+"..else lockb"); synchronized(MyLock.locka) { System.out.println(Thread.currentThread().getName()+".....else locka"); } } } } } } class MyLock { static Object locka = new Object(); static Object lockb = new Object(); } class DeadLockTest { public static void main(String[] args) { Thread t1 = new Thread(new Test(true)); Thread t2 = new Thread(new Test(false)); t1.start(); t2.start(); } }
5.死鎖解決方法:循環
上鎖的順序必須一致。具體來講,咱們人爲地給鎖指定一種相似「水位」的方向性屬性。不管已持有任何鎖,該執行緒全部的上鎖操做,必須按照一致的前後順序從低到高(或從高到低)進行,且在一個系統中,只容許使用一種前後次序