Java併發-活躍性問題

飢餓

當線程由於無法訪問它所需要的資源而不能繼續執行時,就發生了“飢餓“。
引發飢餓的最常見資源就是CPU時鐘週期。(無限循環,或者無限制地等待某個資源)
Thread API中定義的線程優先級只是作爲線程調度的參考,定義了10個優先級,JVM根據需要將它們映射到操作系統的調度優先級。這種映射是與特定平臺相關的,可能某個操作系統中兩個不同的Java優先級可能被映射到同一個優先級。
經常可能發現某個程序會在一些奇怪的地方調用Thread.sleep或Thread.yield,這是因爲該程序試圖客服優先級調整問題或響應性問題,並試圖讓低優先級的線程執行更多的時間

糟糕的響應性

如果某個線程長時間佔有一個鎖(或許正在對一個大容器進行迭代,並且對每個元素驚醒計算祕籍的處理),而其他想要訪問這個容器的線程舊必須等待很長時間。

活鎖

兩個過於禮貌的人在半路上面對面相遇,它們彼此都讓出對方的路,然後又在另一條路上相遇了,反覆地避讓下去。(可以映入隨機性來避免)

順序死鎖

兩個線程試圖以不同的順序來鎖的相同的鎖。

開放調用

如果在調用某個方法時不需要持有鎖,那麼這種調用被稱爲開放調用。

總結

活躍性問題是個非常嚴重的問題,最常見的就是順序死鎖。可以通過使用開放調用來避免。

發佈了125 篇原創文章 · 獲贊 36 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章