併發應用程式及時執行的能力被稱為其活性,本節描述了最常見的活性問題,死鎖,並繼續簡要描述其他兩個活性問題,飢餓和活鎖。
死鎖描述了兩個或多個執行緒永遠被阻塞,等待彼此的情況,這是乙個例子。
alphonse和gaston是朋友,是禮貌的忠實信徒,禮貌的乙個嚴格規則是,當你向朋友鞠躬時,你必須一直鞠躬,直到你的朋友有機會還禮,不幸的是,這條規則沒有考慮到兩個朋友可能同時互相鞠躬的可能性,這個示例應用程式deadlock模擬了這種可能性:
public class deadlock
public string getname()
public synchronized void bow(friend bower)
public synchronized void bowback(friend bower)
}public static void main(string args)
}).start();
new thread(new runnable()
}).start();
}}
當deadlock
執行時,兩個執行緒在嘗試呼叫bowback
時極有可能會阻塞,兩個阻塞都不會結束,因為每個執行緒都在等待另乙個執行緒退出bow
。
飢餓和活鎖問題遠沒有死鎖常見,但仍然是每個併發軟體設計人員可能遇到的問題。
飢餓描述了一種情況,即執行緒無法獲得對共享資源的定期訪問,並且無法取得進展,當「貪婪」執行緒使共享資源長時間不可用時會發生這種情況。例如,假設乙個物件提供了乙個通常需要很長時間才能返回的同步方法,如果乙個執行緒頻繁地呼叫此方法,其他也需要頻繁同步訪問同一物件的執行緒將經常被阻塞。
乙個執行緒經常響應另乙個執行緒的操作,如果另乙個執行緒的操作也是對另乙個執行緒的操作的響應,則可能導致活鎖。與死鎖一樣,活鎖線程無法取得進一步進展,但是,執行緒不會被阻塞 — 它們只是太忙於回應彼此而無法繼續工作。這相當於兩個試圖在走廊裡互相通過的人:alphonse向左移動讓gaston通過,而gaston向右移動讓alphonse通過,看到他們仍然互相阻塞,alphone向右移動,而gaston向左移動,他們還在互相阻塞,所以...。
Java併發程式設計 5 活性
不正確的使用互斥技術會導致各種活性問題。所謂程式活性是指併發應用程式能夠按時完成動作的能力。常見活性問題主要有死鎖 deadlock 飢餓 starvation 和活鎖 livelock 死鎖 死鎖是指多個執行緒為競爭某些共享資源而陷入無限等待狀態。假如有條禮貌規則是,當你向朋友鞠躬時,你要一直彎著...
Java併發程式設計教程
1 使用執行緒的經驗 設定名稱 響應中斷 使用threadlocal 2 executor executorservice和future 3 阻塞佇列 put和take offer和poll drainto 4 執行緒間的協調手段 lock condition wait notify notifya...
Java併發程式設計教程
多執行緒程式包含兩個或多個可同時執行的部分,每個部分可以同時處理不同的任務,從而能更好地利用可用資源,特別是當您的計算機有多個cpu時。多執行緒使您能夠寫入多個活動,可以在同一程式中同時進行操作處理。新執行緒 new 新執行緒在新的狀態下開始其生命週期。直到程式啟動執行緒為止,它保持在這種狀態。它也...