死鎖,飢餓,活鎖
1,死鎖
多個線程,各自佔對方的資源,都不願意釋放,從而造成死鎖
工具:使用jconsole可以檢測程序運行的死鎖線程
2,飢餓
多個線程訪問同一個同步資源,有些線程總是沒有機會得到互斥鎖,這種就叫做飢餓。
出現飢餓的三種情況
a,高優先級的線程吞噬了低優先級的線程的CPU時間片
理論上來說,線程優先級高的線程會比線程優先級低的線程獲得更多的執行機會,但是java的線程優先級絕對出現這樣的效果。
經過測試,優先級高的出現頻率會比優先級低的高很多
不同的操作系統對線程的優先級支持是不同的,規定是在1-10之間,java通過3個常量來屏蔽這種操作系統的底層差異化。
b,線程被永久阻塞在等待進入同步代碼塊的狀態
c,等待的線程永遠不被喚醒
如何避免飢餓問題
a,設置合理的優先級
b,使用公平鎖來代替synchronized這種互斥鎖
3,活鎖
舉個例子,兩個人在走廊上碰見,大家都互相很有禮貌,互相禮讓,A從左到右,B也從從左轉向右,發現又擋住了地方,繼續轉換方向,但又碰到了,反反覆覆,一直沒有機會運行下去。