java社区活跃度_Java并发编程-活跃度问题
在講問題前,我先說明一下什么是活躍度?
一個并發應用及時執行的能力稱作活躍度。
我主要講死鎖問題,順帶介紹一下饑餓,弱響應性和活鎖。
死鎖
死鎖這個詞大家都聽過,我先來羅列一下產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
那程序里產生死鎖的原因主要是:
(1)因為系統資源不足。
(2) 進程運行推進的順序不合適。
(3) 資源分配不當等。
下面我再說一下在Java中常見的幾種出現死鎖的情況:
1.鎖順序死鎖:
這個很簡單,那就是兩個線程通過不同的順序請求多個相同的鎖時發生的死鎖。
舉個例子:就是T1線程擁有L1鎖,T2線程擁有L2鎖,然后T1線程要L2鎖,T2線程要L1鎖,這時就發生死鎖了。
2.動態的所順序死鎖:
有時候獲得鎖的順序并不是固定的,比如說有些程序是根據傳入的參數,來確定鎖的順序的。
這個時候我們就得人為地控制順序了,比如把哈希值大的當作第一個鎖。
3.協作對象間的死鎖:
有時候我們并沒有顯示地加鎖,但調用別的類的方法時,該方法加了鎖。所以我們編程時講究開放調用,當調用的方法不需要持有鎖時,我們稱之為開放調用。其實這個問題主要提醒我們一點,那就是盡量縮小同步塊的范圍,不要隨便就在方法上加個synchronized關鍵字。
4.資源死鎖:
如資源連接池可能出現的分配與請求問題,線程饑餓死鎖等。
那我們如何避免和診斷死鎖呢?
首先盡量讓每個線程一次至多獲得一個鎖。當然有時候業務需要,做不到這樣,那我們就得控制鎖的順序來避免死鎖。盡量進行開放調用。
當然除此以外,我們可以嘗試使用定時的鎖,如tryLock()方法等。當超時時,先放棄資源,并給出提示或拋出異常,當然也可以將給任務重新放進隊列。
我們也可以通過線程轉儲來分析死鎖。
饑餓
當線程訪問它所需要的資源時卻被永久拒絕,以至于不能再繼續進行,這樣就發生了饑餓。比如使用線程的優先級不當就可能造成饑餓。
弱響應性
如GUI線程執行耗時操作時,就會造成弱響應性問題。我們可以把耗時任務分載到后臺線程來避免該問題。
活鎖
活鎖是線程中活躍度失敗的另一種形式,盡管沒有阻塞,線程卻仍然不能繼續,因為它不斷重試相同的操作,卻總是失敗。
這類似于兩個人在一個走廊中過路:Alphonse移到左邊讓Gaston通過,Gaston移到右邊讓Alphonse通過。由于他們被彼此阻塞,Alphonse移到右邊,Gaston移到左邊。他們又會發生阻塞,一直循環下去。。。 ?我個人理解,這和死循環差不多。
總結
以上是生活随笔為你收集整理的java社区活跃度_Java并发编程-活跃度问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无水印GIF软件
- 下一篇: java ee最新_从此再无 JavaE