Java併發程式設計 5 活性

2021-05-22 05:29:46 字數 1016 閱讀 5407

不正確的使用互斥技術會導致各種活性問題。所謂程式活性是指併發應用程式能夠按時完成動作的能力。常見活性問題主要有死鎖(deadlock)、飢餓(starvation)和活鎖(livelock)。 死鎖

死鎖是指多個執行緒為競爭某些共享資源而陷入無限等待狀態。

假如有條禮貌規則是,當你向朋友鞠躬時,你要一直彎著腰,直到朋友鞠躬還禮為止。這個禮貌規則沒有規定同時鞠躬的情況下應該怎麼做。a和b都是非常懂禮貌的朋友,那麼他們之間在鞠躬時就有可能產生如下情況的死鎖:

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();}}

這時兩個朋友之間執行緒就可能產生死鎖。兩個執行緒有可能同時處於bow狀態,分別等待另外乙個人bowback。兩個執行緒永遠不會終止,每個執行緒都在等待另外乙個執行緒退出bow狀態。這是乙個典型死鎖的例子。 飢餓

飢餓是指執行緒長時間無法獲得共享資源從而繼續相繼的處理。這種情況經常發生在當共享資源被「貪婪」執行緒長時間佔據時。假設乙個物件提供的互斥方法需要很長時間處理才能返回,然而如果某執行緒老是頻繁啟用這個方法,那麼其他需要訪問該物件的執行緒就會被長時間阻塞,而處於飢餓狀態。 活鎖

一種常見的執行緒動作是響應另外執行緒的動作。然而如果另外執行緒的動作恰好也是該執行緒的響應,那麼活鎖現象就可能會產生。正如死鎖一樣,處於活鎖狀態的執行緒通常不能繼續後續操作,但它們不是處於阻塞狀態,而是簡單不斷地響應彼此的動作。舉個例子,如果兩朋友a和b在狹窄的走廊裡碰面了,a想靠左以便讓b通過,b想靠右以便a通過,結果他們仍然互相堵住對方的路,於是a便向右讓以便讓b通過,b同時也往左讓,以便讓a通過,於是就他們就如此讓來讓去,一直下去。這就是活鎖。

Java 教程(併發活性)

併發應用程式及時執行的能力被稱為其活性,本節描述了最常見的活性問題,死鎖,並繼續簡要描述其他兩個活性問題,飢餓和活鎖。死鎖描述了兩個或多個執行緒永遠被阻塞,等待彼此的情況,這是乙個例子。alphonse和gaston是朋友,是禮貌的忠實信徒,禮貌的乙個嚴格規則是,當你向朋友鞠躬時,你必須一直鞠躬,直...

《Java併發程式設計實戰》 5

每當看到new thread runnable start 時,並且你希望獲得一種更靈活的執行策略時,請考慮使用excecutor來代替thread。completionservice將execute和blockingqueue的功能融合在一起。executorcompletionservice實現...

併發程式設計5

阻塞與非阻塞 阻塞 程式遇到io操作,導致 無法繼續執行,交出cpu執行權 非阻塞 沒有io操作或者遇到io操作也不阻塞 執行 寫程式時要儘量減少io操作 同步與非同步 同步 發起乙個任務後,必須原地等待任務執行結束,拿到乙個明確的結果 非同步 發起乙個任務後,不需要等待,繼續往下執行 非同步任務的...