1. 程式人生 > >高並發編程-05-活躍性問題

高並發編程-05-活躍性問題

訪問 設置 沒有機會 運行 高並發 系統 tom 兩個 情況

死鎖,饑餓,活鎖

1,死鎖

多個線程,各自占對方的資源,都不願意釋放,從而造成死鎖

工具:使用jconsole可以檢測程序運行的死鎖線程

2,饑餓

多個線程訪問同一個同步資源,有些線程總是沒有機會得到互斥鎖,這種就叫做饑餓。

出現饑餓的三種情況

a,高優先級的線程吞噬了低優先級的線程的CPU時間片

理論上來說,線程優先級高的線程會比線程優先級低的線程獲得更多的執行機會,但是java的線程優先級絕對出現這樣的效果。

經過測試,優先級高的出現頻率會比優先級低的高很多

不同的操作系統對線程的優先級支持是不同的,規定是在1-10之間,java通過3個常量來屏蔽這種操作系統的底層差異化。

b,線程被永久阻塞在等待進入同步代碼塊的狀態

c,等待的線程永遠不被喚醒

如何避免饑餓問題

a,設置合理的優先級

b,使用公平鎖來代替synchronized這種互斥鎖

3,活鎖

舉個例子,兩個人在走廊上碰見,大家都互相很有禮貌,互相禮讓,A從左到右,B也從從左轉向右,發現又擋住了地方,繼續轉換方向,但又碰到了,反反復復,一直沒有機會運行下去。


高並發編程-05-活躍性問題