Java中線程死鎖問題
阿新 • • 發佈:2018-06-29
資源 tar ble eth 服務 say dem -s 環路
我們在使用Thread時,在使用線程同步時可能會出現死鎖,而死鎖產生的原因是:
例:
兩個類中各有兩個方法,而這四種發放同步,比如顧客與服務員解決“先付款還是後付款”的問題時,就會產生死鎖。
死鎖產生的條件:
互斥條件
請求保持條件
不可剝奪條件
環路等待
死鎖的原因:
資源競爭和進程順序推進不當
代碼:
1 package ThreadDemo; 2 3 //在一個同步方法中調用另一個對象的同步方法,可能產生死鎖 4 //死鎖 5 public class ThreadDemo7 { 6 public static void main(String[] args) { 7 newDeadThread(); 8 } 9 } 10 11 class DeadThread implements Runnable{ 12 Customer c = new Customer(); 13 Waiter w = new Waiter(); 14 public DeadThread(){ 15 new Thread(this).start(); 16 w.say(c); 17 } 18 @Override 19 public void run() { 20 // TODO Auto-generated method stub21 c.say(w); 22 } 23 } 24 25 //顧客 26 class Customer{ 27 public synchronized void say(Waiter w){ 28 System.out.println("顧客說:先吃飯再買單"); 29 w.doService(); 30 } 31 public synchronized void doService(){ 32 System.out.println("買完單再吃飯"); 33 } 34 } 35 classWaiter{ 36 public synchronized void say(Customer c){ 37 System.out.println("服務員說:先買單再吃飯"); 38 c.doService(); 39 } 40 public synchronized void doService(){ 41 System.out.println("吃完飯再買單"); 42 } 43 }
Java中線程死鎖問題