日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java社区活跃度_Java并发编程-活跃度问题

發布時間:2024/8/23 java 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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并发编程-活跃度问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。