比如有兩個線程執行,線程t1,
線程t2
t1
需要獲取方法A的鎖標志,同時方法A調用了方法B,t1獲取了A的鎖標志,並獲取了B的鎖標志,才能完成執行
同時t2也在執行,t2獲取方法B的鎖標志,方法B調用了方法A,t2也需要獲取兩個方法A,B的鎖標志才能執行完成
當t1
獲取了A方法的鎖標志,同時t2獲取了B方法的鎖標志
那麼t1會等待t2釋放方法B的鎖標志,t2也在等待t1釋放方法A的鎖標志,這樣就形成了死鎖,都在等待....
⑵ java程序死鎖問題,怎麼解決
在 IBM Bluemix 雲平台上開發並部署您的下一個應用。
開始您的試用
Java 語言通過 synchronized 關鍵字來保證原子性,這是因為每一個 Object 都有一個隱含的鎖,這個也稱作監視器對象。在進入 synchronized 之前自動獲取此內部鎖,而一旦離開此方式,無論是完成或者中斷都會自動釋放鎖。顯然這是一個獨占鎖,每個鎖請求之間是互斥的。相對於眾多高級鎖 (Lock/ReadWriteLock 等),synchronized 的代價都比後者要高。但是 synchronzied 的語法比較簡單,而且也比較容易使用和理解。Lock 一旦調用了 lock() 方法獲取到鎖而未正確釋放的話很有可能造成死鎖,所以 Lock 的釋放操作總是跟在 finally 代碼塊裡面,這在代碼結構上也是一次調整和冗餘。Lock 的實現已經將硬體資源用到了極致,所以未來可優化的空間不大,除非硬體有了更高的性能,但是 synchronized 只是規范的一種實現,這在不同的平台不同的硬體還有很高的提升空間,未來 Java 鎖上的優化也會主要在這上面。既然 synchronzied 都不可能避免死鎖產生,那麼死鎖情況會是經常容易出現的錯誤,下面具體描述死鎖發生的原因及解決方法。
死鎖描述
死鎖是操作系統層面的一個錯誤,是進程死鎖的簡稱,最早在 1965 年由 Dijkstra 在研究銀行家演算法時提出的,它是計算機操作系統乃至整個並發程序設計領域最難處理的問題之一。
事實上,計算機世界有很多事情需要多線程方式去解決,因為這樣才能最大程度上利用資源,才能體現出計算的高效。但是,實際上來說,計算機系統中有很多一次只能由一個進程使用的資源的情況,例如列印機,同時只能有一個進程式控制制它。在多通道程序設計環境中,若干進程往往要共享這類資源,而且一個進程所需要的資源還很有可能不止一個。因此,就會出現若干進程競爭有限資源,又推進順序不當,從而構成無限期循環等待的局面。我們稱這種狀態為死鎖。簡單一點描述,死鎖是指多個進程循環等待它方佔有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那麼死鎖涉及到的各個進程都將永遠處於封鎖狀態。
系統發生死鎖現象不僅浪費大量的系統資源,甚至導致整個系統崩潰,帶來災難性後果。所以,對於死鎖問題在理論上和技術上都必須予以高度重視。
銀行家演算法
一個銀行家如何將一定數目的資金安全地借給若干個客戶,使這些客戶既能借到錢完成要乾的事,同時銀行家又能收回全部資金而不至於破產。銀行家就像一個操作系統,客戶就像運行的進程,銀行家的資金就是系統的資源。
銀行家演算法需要確保以下四點:
當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;
顧客可以分期貸款, 但貸款的總數不能超過最大需求量;
當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間里得到貸款;
當顧客得到所需的全部資金後,一定能在有限的時間里歸還所有的資金。
⑶ Java程序死鎖問題,怎麼解決如下圖
先斷開連接,在連接一次,如果是操作當中出現的死鎖,那就同步一下
⑷ java死鎖怎麼解決
可以試試synchronized,可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多隻有一個線程執行這段代碼。
⑸ Java程序死鎖問題,怎麼解決
可以加一個標識,當超時timeout了,就設置成false,不讓程序繼續執行
⑹ java怎麼避免死鎖
解決方式:
1、盡量使用tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),設置超時時間,超時可以退出防止死鎖。
2、盡量使用java.util.concurrent(jdk 1.5以上)包的並發類代替手寫控制並發,比較常用的是ConcurrentHashMap、ConcurrentLinkedQueue、AtomicBoolean等等,實際應用中java.util.concurrent.atomic十分有用,簡單方便且效率比使用Lock更高 。
3、盡量降低鎖的使用粒度,盡量不要幾個功能用同一把鎖 。
4、盡量減少同步的代碼塊。