JUC之重入鎖ReentrantLock

2021-09-25 04:28:31 字數 1449 閱讀 7198

重入鎖是一種遞迴無堵塞的同步機制。類似於synchronized,但是比synchronized更加的靈活,可自由選擇加鎖的位置。它有乙個與鎖相關的獲取計數器,如果擁有鎖的某個執行緒再次得到鎖,那麼獲取計數器加1,並且鎖需要被釋放兩次才能真正獲得釋放。

重入鎖提供了兩種加鎖方式,公平鎖以及非公平鎖。預設是非公平鎖。

公平鎖表示執行緒獲取鎖的順序是按照執行緒加鎖的順序來分配的,即先來先得的fifo先進先出順序。而非公平鎖是一種獲取鎖的搶占機制,是隨機獲得鎖的,和公平鎖不一樣的就是先來的不一定先得到鎖,這個方式肯呢過造成某些執行緒一直拿不到鎖,結果也就是不公平的了。

lock():

lockinterruptibly()

trylock():僅在呼叫時鎖未被另乙個執行緒保持的情況下,才獲取該鎖。

reentrantlock是在aqs的基礎上實現的獨佔鎖。

嘗試加鎖

final void lock()
非公平鎖方式下嘗試獲取鎖

final boolean nonfairtryacquire(int acquires) 

}//重入的邏輯

// 同一執行緒再次獲取鎖

else if (current == getexclusiveownerthread())

return false;

}

鎖的釋放

public final boolean release(int arg) 

return false;

}

具體的釋放邏輯

protected final boolean tryrelease(int releases) 

//設定鎖的狀態

setstate(c);

return free;

}

公平鎖與非公平鎖的區別

public final boolean hasqueuedpredecessors()
與lock的區別在與如下方法

private void doacquireinterruptibly(int arg)

throws interruptedexception

// 此處,lock只是返回中斷狀態,而lockinterruptibly則丟擲異常

if (shouldparkafte***iledacquire(p, node) &&

parkandcheckinterrupt())

throw new interruptedexception();

}} finally

}

與lock的區別在於在未獲得鎖的情況下,並未進行入等待佇列的操作,而是直接返回結果。

總的來說,只要理解aqs後,重入鎖的相關實現也就很簡單了。

JUC之讀寫鎖

是什麼?讀寫分離的鎖。locks包下的 lock condition readwritelock 裡面的readwritelock 讀寫鎖 維護了一對讀寫操作。讀的鎖可以共享 又叫共享鎖 寫的鎖獨佔 又叫獨佔鎖 即寫操作只能開始寫 寫結束,中間不能插入任何寫的操作。怎麼用?如果沒有鎖的情況 publ...

可重入鎖 不可重入鎖

可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...

可重入鎖和不可重入鎖

當乙個執行緒獲得當前例項的鎖lock,並且進入了方法a,該執行緒在方法a沒有釋放該鎖的時候,是否可以再次進入使用該鎖的方法b?不可重入鎖 在方法a釋放鎖之前,不可以再次進入方法b 可重入鎖 在方法a釋放該鎖之前可以再次進入方法b 如reentrantlock和synchronized 不可重入鎖的實...