顯示鎖於內置鎖能提供共同的互斥性和可見性,可是顯示鎖在功能上更加豐富,對於死鎖提供瞭解決方案,支持定時獲取鎖,可中斷獲取鎖(當線程在獲取鎖上阻塞時,能對中斷做出響應),公平鎖,非公平鎖(有優點,主要體如今一個線程獲取鎖時,發現該鎖已經被獲取了,則將掛起阻塞知道鎖被釋放,線程被喚醒,線程阻塞掛起與被喚醒花銷很大,假設這時候恰好有個線程也來獲取鎖,爲何不直接給它呢,反正最後都能獲取到鎖),讀寫鎖(readWriteLock)。安全
分佈式鎖:數據結構
ReentrantLock的底層實現:分佈式
在講解ReentrantLock以前,先來說解下AbstractQuenueSychronized。數據結構:狀態量state,隱形的FIFO同步隊列,節點Node,Node節點又包含prevNode,nextNode,thread,waitStatus,nextWatier,其中waitStatus用於標示節點的狀態:cancel,signal(標示後續的節點處於阻塞狀態,每次插入一個後續節點時都置前置節點狀態爲signal),condition,propagate。操做:acquire:首先判斷鉤子函數tryAcquire是否成功,便是否容許當前線程進行,若不容許的話,則新建一個Node節點,將該Node節點添加到FIFO隊列的尾部(必須保證添加操做的線程安全,採用CAS操做),而後設置前置節點(跳過那些cancel狀態的前置節點)的狀態爲signal(線程安全操做,CAS),而且用locksupport.park()阻塞線程,而後循環等待當前的前置節點是Head節點(當前節點是head節點意味着本身將被喚醒),當前置節點是頭節點時將再次調用tryAcquire()去獲取同步狀態()。release:調用鉤子函tryRelease,而後同步更新Head節點的狀態爲初始狀態,並用Locksupport.unpark()喚醒下一個正常的Node(非正常指null,cancel狀態的Node)。函數
ReentrantLock是怎麼經過AQS來實現的呢ui
ReentrantLock支持公平鎖和非公平鎖。底層經過繼承AQS來實現公平鎖和非公平鎖。操做:tryLock(),公平鎖:AQS裏面的state狀態表示鎖的重入次數,實現tryAcquire方法,首先獲取狀態值,若狀態值爲0代表當前線程能夠獲取該鎖,同步更新state狀態值得,並將currentThread置爲鎖的擁有者,若狀態值不爲0則觀察當前線程是否時線程全部者,如果則state++,若不是則返回false。公平鎖:實現方式相似。只是在獲取鎖時,先從同步隊列中看下是否有更早開始等待的鎖,如有則返回false。release():狀態值改變,線程擁有者置null。線程