鍍金池/ 問答/Java  Linux  網(wǎng)絡(luò)安全/ 另一個線程是怎么知道互斥量被釋放的呢?

另一個線程是怎么知道互斥量被釋放的呢?

自旋鎖很好理解,就是不斷地輪詢,那么互斥鎖是通過什么樣的機制呢?這樣的機制有什么弊端導(dǎo)致在一些場合用自旋鎖更好呢?

回答
編輯回答
尛曖昧

并不是線程“知道”,而是等待時會進入阻塞狀態(tài),擁有鎖的線程在釋放鎖時需要通知等待線程,這樣等待線程才能被喚醒。

至于自旋鎖,其優(yōu)點是無需進入阻塞狀態(tài),因此節(jié)省了阻塞和喚醒的切換開銷。但缺點是會一直占用CPU,如果長時間無法獲取到鎖,反而會增加開銷,降低性能。

2017年11月22日 10:15
編輯回答
扯不斷

補充一下樓上,線程切換的開銷大于短時間輪詢的開銷,如果需要在臨界區(qū)外等待的時間很短,則使用輪詢以降低開銷,而在這種情況下使用普通的互斥鎖會導(dǎo)致頻繁的線程切換;若需要在臨界區(qū)外等待的時間比較長,則使用普通的互斥鎖會比輪詢的開銷小,線程無需“忙等待”而去“睡覺”即可,等待有人出了臨界區(qū),睡覺的線程就會被叫醒。更多內(nèi)容參考《操作系統(tǒng)》,盡量看英文原版,中文版翻譯非常劣質(zhì),poorly translated

2017年4月21日 19:08