天天看點

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擷取鎖