重入鎖是一種遞迴無堵塞的同步機制。類似於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 不可重入鎖的實...