ReentrantLock之unlock方法分析

2021-08-18 01:40:33 字數 1109 閱讀 6216

public

void

unlock

()public

final

boolean

release

(int

arg)

return

false;}

release(1),嘗試在當前鎖的鎖定計數(state)值上減1。成功返回true,否則返回false。當然在release()方法中不僅僅只是將state - 1這麼簡單,- 1之後還需要進行一番處理,如果-1之後的新state = 0 ,則表示當前鎖已經被執行緒釋放了,同時會喚醒執行緒等待佇列中的下乙個執行緒,當然該鎖不一定就一定會把所有權交給下乙個執行緒,能不能成功就看它是不是親爹生的了(看運氣)。

protected

final

boolean

tryrelease

(int

releases)//

設定state

setstate(c

);return

free;}

在release**中有一段**很重要:

nodeh =

head;if

(h !=null&&h

.waitstatus !=0

)unparksuccessor(h

);return

true

;

waitstatus!=0表明或者處於cancel狀態,或者是置signal表示下乙個執行緒在等待其喚醒。也就是說waitstatus不為零表示它的後繼在等待喚醒。

unparksuccessor()方法:

private

void

unparksuccessor

(node

node)if

(s !=null

)locksupport

.unpark(s

.thread);}

注:unlock最好放在finally中!!!!!!unlock最好放在finally中!!!!!! unlock最好放在finally中!!!!!! (重要的事說三遍)

併發學習之 ReentrantLock

在 jdk 6 之前,儘管 synchronized 關鍵字實現同步很方便,但是這種同步操作很重量級,很大程度上影響程式的執行效率,所以對於開發者來說,使用起來會有點畏懼。但是在 jdk 6 之後,對 synchronized 進行了很大的優化,引入了偏向鎖,適應性自旋,輕量級鎖和重量級鎖,鎖粗化等...

ReentrantLock之AQS原理與原始碼詳解

abstractqueuedsynchronizer,抽象佇列同步器 給大家畫乙個圖先,看一下reentrantlock和aqs之間的關係。abstractqueuedsynchronizer為reentrantlock的靜態內部類 2 預設為非公平鎖 3 最終會呼叫abstractqueuedsy...

JUC之重入鎖ReentrantLock

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