自旋鎖


自旋鎖是計算機科學用於多線程同步的一種鎖,線程反復檢查鎖變量是否可用。由於線程在這一過程中保持執行,因此是一種忙等待。

自旋鎖避免了進程上下文的調度開銷,因此對於線程只會阻塞很短時間的場合是有效的。因此操作系統的實現在很多地方往往用自旋鎖。Windows操作系統提供的輕型讀寫鎖(SRW Lock)內部就用了自旋鎖。顯然,單核CPU不適於使用自旋鎖,這里的單核CPU指的是單核單線程的CPU,因為,在同一時間只有一個線程是處在運行狀態,假設運行線程A發現無法獲取鎖,只能等待解鎖,但因為A自身不掛起,所以那個持有鎖的線程B沒有辦法進入運行狀態,只能等到操作系統分給A的時間片用完,才能有機會被調度。這種情況下使用自旋鎖的代價很高。(紅字部分是我給wiki編輯的詞條,單核CPU不適合自旋鎖,這個也只是針對單核單線程的情況,現在的技術基本單核都是支持多線程的)

為什么要使用自旋鎖
互斥鎖有一個缺點,他的執行流程是這樣的 托管代碼 - 用戶態代碼 - 內核態代碼、上下文切換開銷與損耗,假如獲取到資源鎖的線程A立馬處理完邏輯釋放掉資源鎖,如果是采取互斥的方式,那么線程B從沒有獲取鎖到獲取鎖這個過程中,就要用戶態和內核態調度、上下文切換的開銷和損耗。所以就有了自旋鎖的模式,讓線程B就在用戶態循環等着,減少消耗。

自旋鎖比較適用於鎖使用者保持鎖時間比較短的情況,這種情況下自旋鎖的效率要遠高於互斥鎖。

自旋鎖可能潛在的問題
過多占用CPU的資源,如果鎖持有者線程A一直長時間的持有鎖處理自己的邏輯,那么這個線程B就會一直循環等待過度占用cpu資源
遞歸使用可能會造成死鎖,不過這種場景一般寫不出來
CAS
就不寫術語定義了,簡單的理解就是這個CAS是由操作系統定義的,由若干指令組成的,這個操作具有原子性,這些指令如果執行,就會全部執行完,不會被中斷。CAS有3個操作數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改為B,否則什么都不做。

CAS的問題
經典的CAS的ABA問題,上面提到了CAS操作的時候,要檢測值有沒有變化,如果一個值原來是A,后來變成了B, 后來又變成了A,CAS會認為沒有發生變化。
解決方案:

   1. 加版本號   1A - 2B -  3A

    2. 對java而言,jdk1.5提供了AtomicStampedReference來解決這個問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM