首先我們先搞明白繼承關係, reentrantlock的內部類fairsync extends sync extends abstractqueuedsynchronizer
reentrantlock中的內部類fairsync中lock方法,呼叫了abstractqueuedsynchronizer中的acquire()方法。
final void lock()
acquire()方法中呼叫了子類fairsync中tryacquire()方法和自身的acquirequeued()方法。
public final void acquire(int arg)
我們先看tryacquire(),先判斷state是否為0,如果為0就執行上面提到的lock方法的前半部分,通過cas操作將state的值從0變為1,否則判斷當前執行緒是否為exclusiveownerthread,然後把state++,也就是重入鎖的體現,我們注意前半部分是通過cas來保證同步,後半部分並沒有同步的體現,原因是:後半部分是執行緒重入,再次獲得鎖時才觸發的操作,此時當前執行緒擁有鎖,所以對reentrantlock的屬性操作是無需加鎖的。如果tryacquire()獲取失敗,則要執行addwaiter()向等待佇列中新增乙個獨佔模式的節點。
protected final boolean tryacquire(int acquires)
}else if (current == getexclusiveownerthread())
return false;
}
4.如果tryacquire()返回false了,那麼此時就得acquirequeued()方法。首先利用addwaiter()方法將執行緒封裝成乙個節點,加入了同步佇列。在acquirequeued()方法中,如果當前節點的前驅節點是頭節點,那麼就呼叫tryacquire()獲取同步狀態。
final boolean acquirequeued(final node node, int arg)
if (shouldparkafte***iledacquire(p, node) &&
parkandcheckinterrupt())
interrupted = true;
}} finally
}
公平鎖和非公平鎖的區別
鎖的公平性是相對於獲取鎖的順序而言的,如果是乙個公平鎖,那麼鎖的獲取順序就應該符合請求的絕對時間順序,也就是fifo。在上面分析的例子來說,只要cas設定同步狀態成功,則表示當前執行緒獲取了鎖,而公平鎖則不一樣,差異點有兩個 fairsync.tryacquire final void lock 非...
鎖的認識lock
case 1 事務正在更新一張table,並且該事務並沒有處理結束。此時,使用select查詢出來的結果是?update之前的?之後的?始終沒有output,知道事務處理結束?1 始終處於被堵塞狀態 begin tran update student set name change where id...
Lock鎖與synchronized鎖的區別
1 synchronized鎖是可以幫助我們自動開鎖和關閉鎖 2 lock鎖,我們最常用的是reentrantlock重入鎖,需要我們手動的開鎖和手動關鎖 3 synchronized只能與wait notify 方法一起使用 4 reentrantlock只能與condition類中的await ...