1. 程式人生 > >Java中線程死鎖問題

Java中線程死鎖問題

資源 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         new
DeadThread(); 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 stub
21 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 class
Waiter{ 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中線程死鎖問題