CAS-自旋鎖

自旋鎖
  自旋鎖(spinlock):是指當一個線程在獲取鎖的時候,若是鎖已經被其它線程獲取,那麼該線程將循環等待,而後不斷的判斷鎖是否可以被成功獲取,直到獲取到鎖纔會退出循環。
   獲取鎖的線程一直處於活躍狀態,可是並無執行任何有效的任務,使用這種鎖會形成 busy-waiting

自旋鎖存在的問題

  1. 若是某個線程持有鎖的時間過長,就會致使其它等待獲取鎖的線程進入循環等待,消耗CPU。使用不當會形成CPU使用率極高。
  2. 上面Java實現的自旋鎖不是公平的,即沒法知足等待時間最長的線程優先獲取鎖。不公平的鎖就會存在「線程飢餓」問題。

自旋鎖的優勢

  1. 自旋鎖不會使線程狀態發生切換,一直處於用戶態,即線程一直都是active的;不會使線程進入阻塞狀態,減小了沒必要要的上下文切換,執行速度快
  2. 非自旋鎖在獲取不到鎖的時候會進入阻塞狀態,從而進入內核態,當獲取到鎖的時候須要從內核態恢復,須要線程上下文切換。 (線程被阻塞後便進入內核(Linux)調度狀態,這個會致使系統在用戶態與內核態之間來回切換,嚴重影響鎖的性能)

自旋鎖與互斥鎖

  • 自旋鎖與互斥鎖都是爲了實現保護資源共享的機制。
  • 不管是自旋鎖仍是互斥鎖,在任意時刻,都最多隻能有一個保持者。
  • 獲取互斥鎖的線程,若是鎖已經被佔用,則該線程將進入睡眠狀態;獲取自旋鎖的線程則不會睡眠,而是一直循環等待鎖釋放。
相關文章
相關標籤/搜索