基於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獲取鎖
