关于ReetrantLock
ReetrantLock?? 內(nèi)部靜態(tài)類? Sync? 繼承AbstractQueuedSynchronizer(負(fù)責(zé)阻塞隊列,線程去槍戰(zhàn)鎖,并且包含了node)
NonfairSync? extends Sync extends AbstractQueuedSynchronizer
FairSync extends Sync extends AbstractQueuedSynchronizer
AbstractQueuedSynchronizer?中有一個模板方法 tryacquire(模板模式)
非公平鎖NonfairSync
?final void lock() {
//直接槍占啊。基于cas保證state操作在并發(fā)的時候是正確的
??????????? if (compareAndSetState(0, 1))
??????????????? setExclusiveOwnerThread(Thread.currentThread());
??????????? else
??????????????? acquire(1);
??????? }
公平鎖FairSync
??????? final void lock() {
??????????? acquire(1);
??????? }
acquire的方法 是在AbstractQueuedSynchronizer中實現(xiàn)的
public final void acquire(int arg) {
//addWaiter是加入到隊列尾巴 吧線程封裝成node? acquireQueued里面又做了循環(huán)。所有線程去搶占鎖。至于里面的對線程的狀態(tài)的切換不用關(guān)系
??????? if (!tryAcquire(arg) &&
??????????? acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
??????????? selfInterrupt();
??? }
tryAcquire 在AbstractQueuedSynchronizer 只是實現(xiàn)了個方法
?protected boolean tryAcquire(int arg) {
??????? throw new UnsupportedOperationException();
??? }
具體的實現(xiàn)分別在NonfairSync? FairSync
前者
?final boolean nonfairTryAcquire(int acquires) {
??????????? final Thread current = Thread.currentThread();
??????????? int c = getState();
??????????? if (c == 0) {
??????????????? if (compareAndSetState(0, acquires)) {
??????????????????? setExclusiveOwnerThread(current);
??????????????????? return true;
??????????????? }
??????????? }
??????????? else if (current == getExclusiveOwnerThread()) {
??????????????? int nextc = c + acquires;
??????????????? if (nextc < 0) // overflow
??????????????????? throw new Error("Maximum lock count exceeded");
??????????????? setState(nextc);
??????????????? return true;
??????????? }
??????????? return false;
??????? }
后者
protected final boolean tryAcquire(int acquires) {
??????????? final Thread current = Thread.currentThread();
??????????? int c = getState();
??????????? if (c == 0) {
//判斷當(dāng)前線程是否是隊列頭 保證了按順序
??????????????? if (!hasQueuedPredecessors() &&
??????????????????? compareAndSetState(0, acquires)) {
??????????????????? setExclusiveOwnerThread(current);
??????????????????? return true;
??????????????? }
??????????? }
??????????? else if (current == getExclusiveOwnerThread()) {
??????????????? int nextc = c + acquires;
??????????????? if (nextc < 0)
??????????????????? throw new Error("Maximum lock count exceeded");
??????????????? setState(nextc);
??????????????? return true;
??????????? }
??????????? return false;
??????? }
轉(zhuǎn)載于:https://www.cnblogs.com/tecnologycc/p/10174689.html
總結(jié)
以上是生活随笔為你收集整理的关于ReetrantLock的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 启动卡主,cpu 100%
- 下一篇: tensorflow 滑动平均使用和恢复