上一篇學習了非公平鎖,本節來看看公平鎖的實現
公平鎖在創建對象時候需要添加一個參數,true
lock方法此時調用的是公平鎖的lock方法,然后內部又調用了acquire()方法
這里又調用了公平鎖的tryAcquire
這里與非公平鎖的唯一區別是在獲取鎖的時候首先調用的是hasQueuedPredecessors(),而非公平鎖這里調用的則是后面的CAS嘗試去修改狀態。這也就是上文中說的公平與非公平鎖的區別體現在這里。
這個方法很簡單,就是看現在有沒有等待線程的node鏈條,如果沒有則體現在頭和尾不相等,且頭的下一個node節點null或者不為null時候下一個節點的線程不是當前線程,此時候才回去嘗試獲取鎖
其他的方法與非公平鎖是一致的,請看我的上一篇文章
JDK8的RentrantLock源碼學習--非公平鎖:http://www.lxweimin.com/p/b1dee032856e