publicvoid
unlock
()public
final
boolean
release
(int
arg)
return
false;}
release(1),嘗試在當前鎖的鎖定計數(state)值上減1。成功返回true,否則返回false。當然在release()方法中不僅僅只是將state - 1這麼簡單,- 1之後還需要進行一番處理,如果-1之後的新state = 0 ,則表示當前鎖已經被執行緒釋放了,同時會喚醒執行緒等待佇列中的下乙個執行緒,當然該鎖不一定就一定會把所有權交給下乙個執行緒,能不能成功就看它是不是親爹生的了(看運氣)。
protectedfinal
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()方法:
privatevoid
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,並且鎖需要被釋放兩次才能真正獲得釋放。重入鎖提供了兩種加鎖方式,公平鎖以及非公平鎖。預...