上一篇學(xué)習(xí)了非公平鎖爹谭,本節(jié)來看看公平鎖的實現(xiàn)
公平鎖在創(chuàng)建對象時候需要添加一個參數(shù),true
lock方法此時調(diào)用的是公平鎖的lock方法窿锉,然后內(nèi)部又調(diào)用了acquire()方法
這里又調(diào)用了公平鎖的tryAcquire
這里與非公平鎖的唯一區(qū)別是在獲取鎖的時候首先調(diào)用的是hasQueuedPredecessors()褒侧,而非公平鎖這里調(diào)用的則是后面的CAS嘗試去修改狀態(tài)。這也就是上文中說的公平與非公平鎖的區(qū)別體現(xiàn)在這里啦吧。
這個方法很簡單您觉,就是看現(xiàn)在有沒有等待線程的node鏈條拙寡,如果沒有則體現(xiàn)在頭和尾不相等授滓,且頭的下一個node節(jié)點null或者不為null時候下一個節(jié)點的線程不是當(dāng)前線程,此時候才回去嘗試獲取鎖
其他的方法與非公平鎖是一致的肆糕,請看我的上一篇文章
JDK8的RentrantLock源碼學(xué)習(xí)--非公平鎖:http://www.reibang.com/p/b1dee032856e