ReentrantLock原理

ReentrantLock主要利用CAS+AQS隊列來實現。

CAS:Compare and Swap,比較並交換。CAS有3個操作數:內存值V、預期值A、要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改為B,否則什麼都不做。該操作是一個原子操作,被廣泛的應用在Java的底層實現中。在Java中,CAS主要是由sun.misc.Unsafe這個類通過JNI調用CPU底層指令實現

AbstractQueuedSynchronizer簡稱AQ

【AQS】

是一個用於構建鎖和同步容器的框架。事實上concurrent包內許多類都是基於AQS構建,例如ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock,FutureTask等。AQS解決了在實現同步容器時設計的大量細節問題。

ReentrantLock原理AQS使用一個FIFO的隊列表示排隊等待鎖的線程,隊列頭節點稱作“哨兵節點”或者“啞節點”,它不與任何線程關聯。其他的節點與等待線程關聯,每個節點維護一個等待狀態waitStatus

ReentrantLock的基本實現可以概括為:先通過CAS嘗試獲取鎖。如果此時已經有線程佔據了鎖,那就加入AQS隊列並且被掛起。當鎖被釋放之後,排在CLH隊列隊首的線程會被喚醒,然後CAS再次嘗試獲取鎖。在這個時候,如果:

非公平鎖:如果同時還有另一個線程進來嘗試獲取,那麼有可能會讓這個線程搶先獲取;

公平鎖:如果同時還有另一個線程進來嘗試獲取,當它發現自己不是在隊首的話,就會排到隊尾,由隊首的線程獲取到鎖。


分享到:


相關文章: