AQS實現公平鎖和非公平鎖


基於AQS的鎖(比如ReentrantLock)原理大體是這樣:
有一個state變量,初始值為0,假設當前線程為A,每當A獲取一次鎖,status++. 釋放一次,status--.鎖會記錄當前持有的線程。
當A線程擁有鎖的時候,status>0. B線程嘗試獲取鎖的時候會對這個status有一個CAS(0,1)的操作,嘗試幾次失敗后就掛起線程,進入一個等待隊列。
如果A線程恰好釋放,--status==0, A線程會去喚醒等待隊列中第一個線程,即剛剛進入等待隊列的B線程,B線程被喚醒之后回去檢查這個status的值,嘗試CAS(0,1),而如果這時恰好C線程也嘗試去爭搶這把鎖

非公平鎖實現:
C直接嘗試對這個status CAS(0,1)操作,並成功改變了status的值,B線程獲取鎖失敗,再次掛起,這就是非公平鎖,B在C之前嘗試獲取鎖,而最終是C搶到了鎖。
公平鎖:
C發現有線程在等待隊列,直接將自己進入等待隊列並掛起,B獲取鎖


免責聲明!

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



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