ReentrantLock 原理分析

2021-10-08 17:17:41 字數 1924 閱讀 3761

鎖是一段**,當執行緒執行到這段**時執行緒阻塞(掛起)或者進入輪詢

使用方式:

reentrantlock lock = new reentrantlock();//預設建立非公平鎖

lock.lock();

***鎖住的**邏輯

***lock.unlock();

執行到 lock()方法時做的事情(建立的非公平鎖):

(1)判斷當前執行緒能否獲取鎖

(2)如果不能獲取鎖把當前執行緒加入到等待的執行緒佇列中

(3)當前執行緒掛起

(4)等待當前執行緒的上乙個執行緒釋放鎖以後喚醒當前執行緒

按著步驟做具體**分析:

(1)判斷當前執行緒能否獲取鎖

//reentrantlock 的無參建構函式預設生成非公平鎖

static final class nonfairsync extends sync

}

(2)把執行緒加到佇列中

//把執行緒加入到佇列的方法入口

public final void acquire(int arg)

tryacquire方法執行一下操作:

//非公平方式獲取鎖

final boolean nonfairtryacquire(int acquires)

} else if (current == getexclusiveownerthread())

return false;

}}addwaiter執行一下操作:

}//如果沒有尾節點,也就是說隊列為空,需要先初始化乙個空的【節點的執行緒變數為null】節點當頭,然後把當前節點往頭節點後邊加

enq(node);

return node;

}}

(3) 當前執行緒掛起:

//判斷當前執行緒能否掛起

/***假如第一次迴圈當前執行緒不是頭節點,判斷是否能夠掛起,經過下邊的操作假如說不能掛起

*會進行二次迴圈,二次迴圈到這兒的時候當前執行緒的前乙個節點已經是掛起狀態,反正也輪

*不到當前執行緒啥事,也就直接掛起了當前執行緒

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

parkandcheckinterrupt())

interrupted = true;

}} finally

}private static boolean shouldparkafte***iledacquire(node pred, node node) while (pred.waitstatus > 0);

pred.next = node;

} else

return false;

}//掛起當前執行緒

private final boolean parkandcheckinterrupt() }

(4)等待當前執行緒的上乙個執行緒釋放鎖以後喚醒當前執行緒

//當前執行緒執行完後執行釋放鎖方法,lock.unlock()方法

public void unlock()

public final boolean release(int arg)

return false;

}protected final boolean tryrelease(int releases)

//更新鎖的狀態

setstate(c);

return free;

}private void unparksuccessor(node node)

//喚醒下乙個節點

if (s != null)

locksupport.unpark(s.thread);

}

已上為reentrantlock鎖的原理

ReentrantLock 原理分析

public void lock 這是lock的原始碼,呼叫的其實是sync這個物件的lock函式,而sync是reentrantlock內部類sync的乙個物件例項,他有兩種實現nonfairsync 非公平鎖 和fairsync 公平鎖 先看公平鎖的lock函式 final void lock ...

ReentrantLock實現原理分析

本文只對reentrantlock中獲取鎖和釋放鎖的方法進行分析,其它方法不做分析。final void lock protected final boolean tryacquire int acquires else if current getexclusiveownerthread retu...

ReentrantLock之AQS原理與原始碼詳解

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