本文目錄一覽:
如何避免Java線程死鎖
Lock介面: 出現替代了同步代碼塊或者同步函數。將同步的隱式鎖操作變成現實鎖操作。
同時更為靈活。可以一個鎖上加上多組監視器。
lock():獲取鎖。
unlock():釋放鎖,通常需要定義finally代碼塊中。
Condition介面:出現替代了Object中的wait notify notifyAll方法。
將這些監視器方法單獨進行了封裝,變成Condition監視器對象。
可以任意鎖進行組合。
如何避免Java多線程中的死鎖
死鎖產生的必要條件
產生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發生。
互斥條件:進程要求對所分配的資源(如印表機)進行排他性控制,即在一段時間內某 資源僅為一個進程所佔有。此時若有其他進程請求該資源,則請求進程只能等待。
不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能 由獲得該資源的進程自己來釋放(只能是主動釋放)。
請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其他進程佔有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
循環等待條件:存在一種進程資源的循環等待鏈,鏈中每一個進程已獲得的資源同時被 鏈中下一個進程所請求。即存在一個處於等待狀態的進程集合{Pl, P2, …, pn},其中Pi等 待的資源被P(i+1)佔有(i=0, 1, …, n-1),Pn等待的資源被P0佔有
java 線程池原理怎樣避免線程死鎖
Java線程死鎖需要如何解決,這個問題一直在我們不斷的使用中需要只有不斷的關鍵。不幸的是,使用上鎖會帶來其他問題。讓我們來看一些常見問題以及相應的解決方法: Java線程死鎖 Java線程死鎖是一個經典的多線程問題,因為不同的線程都在等待那些根本不可能被釋放的鎖,從而導致所有的工作都無法完成。假設有兩個線程,分別代表兩個飢餓的人,他們必須共享刀叉並輪流吃飯。他們都需要獲得兩個鎖:共享刀和共享叉的鎖。 假如線程 「A」獲得了刀,而線程「B」獲得了叉。線程「A」就會進入阻塞狀態來等待獲得叉,而線程「B」則阻塞來等待「A」所擁有的刀。這只是人為設計的例子,但儘管在運行時很難探測到,這類情況卻時常發生。雖然要探測或推敲各種情況是非常困難的,但只要按照下面幾條規則去設計系統,就能夠避免Java線程死鎖問題: 讓所有的線程按照同樣的順序獲得一組鎖。這種方法消除了 X 和 Y 的擁有者分別等待對方的資源的問題。 將多個鎖組成一組並放到同一個鎖下。前面Java線程死鎖的例子中,可以創建一個銀器對象的鎖。於是在獲得刀或叉之前都必須獲得這個銀器的鎖。 將那些不會阻塞的可獲得資源用變數標誌出來。當某個線程獲得銀器對象的鎖時,就可以通過檢查變數來判斷是否整個銀器集合中的對象鎖都可獲得。如果是,它就可以獲得相關的鎖,否則,就要釋放掉銀器這個鎖並稍後再嘗試。 最重要的是,在編寫代碼前認真仔細地設計整個系統。多線程是困難的,在開始編程之前詳細設計系統能夠幫助你避免難以發現Java線程死鎖的問題。 Volatile 變數,volatile 關鍵字是 Java 語言為優化編譯器設計的。以下面的代碼為例: 一.class VolatileTest { 二.public void foo() { 三.boolean flag = false; 四.if(flag) { 5.//this could happen 陸.} 漆.} 吧.} 一個優化的編譯器可能會判斷出if部分的語句永遠不會被執行,就根本不會編譯這部分的代碼。如果這個類被多線程訪問, flag被前面某個線程設置之後,在它被if語句測試之前,可以被其他線程重新設置。用volatile關鍵字來聲明變數,就可以告訴編譯器在編譯的時候,不需要通過預測變數值來優化這部分的代碼。 無法訪問的Java線程死鎖有時候雖然獲取對象鎖沒有問題,線程依然有可能進入阻塞狀態。在 Java 編程中IO就是這類問題最好的例子。當線程因為對象內的IO調用而阻塞時,此對象應當仍能被其他線程訪問。該對象通常有責任取消這個阻塞的IO操作。造成阻塞調用的線程常常會令同步任務失敗。如果該對象的其他方法也是同步的,當線程被阻塞時,此對象也就相當於被冷凍住了。 其他的線程由於不能獲得對象的Java線程死鎖,就不能給此對象發消息(例如,取消 IO 操作)。必須確保不在同步代碼中包含那些阻塞調用,或確認在一個用同步阻塞代碼的對象中存在非同步方法。儘管這種方法需要花費一些注意力來保證結果代碼安全運行,但它允許在擁有對象的線程發生阻塞後,該對象仍能夠響應其他線程。 編輯推薦: 一. Java多線程優化之偏向鎖原理分析 二. Java多線程實現非同步調用的方法 三. 使用Java多線程機制實現下載的方法介
在Java程序設計中如何避免死鎖?
1、在程序中盡量使用開放調用。依賴於開放調用的程序,相比於那些在持有鎖的時候還調用外部方法的程序,更容易進行死鎖自由度的分析。重新構建synchronized使開放調用更加安全。所謂開放調用是指調用的方法本身沒有加鎖,但是要以對方法操作的內容進行加鎖。
2、如果你必須獲得多個鎖,那麼鎖的順序必須是你設計工作的一部分:盡量減少潛在鎖之間的交互數量,遵守並文檔化該鎖順序協議。監測代碼中死鎖自由度的策略有:
1)識別什麼地方會獲取多個鎖,並使鎖數量儘可能少,保證它們的順序在程序中一致。
2)在沒有非開放調用的程序中,發現那些獲得多重鎖的實例是非常簡單的。
3、嘗試定時的鎖,使用每個顯式Lock類中定時tryLock特性,來替代使用內部鎖機制
原創文章,作者:BMYK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/144969.html