這篇文章主要講解了“如何理解ReentrantLock非公平鎖源碼”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解ReentrantLock非公平鎖源碼”吧!

十年品牌的成都網(wǎng)站建設公司,上1000家企業(yè)網(wǎng)站設計經(jīng)驗.價格合理,可準確把握網(wǎng)頁設計訴求.提供定制網(wǎng)站建設、購物商城網(wǎng)站建設、小程序制作、成都響應式網(wǎng)站建設公司等服務,我們設計的作品屢獲殊榮,是您值得信賴的專業(yè)網(wǎng)站設計公司。
1.鎖
java中,加鎖的方式
synchronized,這個是 java 底層實現(xiàn)的,也就是 C 語言實現(xiàn)的。
. lock,這個是 java.util.concurrent 包下面的,是 java語言實現(xiàn)的。
2.ReentrantLock
ReentrantLock 是 Lock 的一種實現(xiàn),是一種可重入的公平或非公平鎖。默認是非公平鎖。
2.1 Lock的創(chuàng)建
首先看下鎖的創(chuàng)建和使用代碼:
//創(chuàng)建鎖 Lock lock = new ReentrantLock(); //加鎖 lock.lock(); //釋放鎖 lock.unlock();
然后看下創(chuàng)建的是 ReentrantLock 的構造函數(shù):
public ReentrantLock() { sync = new NonfairSync(); }NonfairSync 就是非公平鎖。所以 ReentrantLock 默認是非公平鎖的實現(xiàn)
2.2 lock()
加鎖的邏輯就比較復雜了,因為存在線程競爭。所以有兩種情況,一種是競爭到鎖的處理,一種是沒有競爭到鎖的處理。
首先我們還是來看下 lock() 方法,因為最終是非公平的實現(xiàn),所以直接看 NonfairSync 里面的 lock 方法。
final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); }2.3 沒有獲取到鎖的邏輯 acquire()
直接上代碼:
public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); }還是3個方法,阿粉一個一個的說。
tryAcquire(arg) ,還是先看代碼在分析。
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; }a. 獲取 state ,如果等于0,說明之前獲得鎖的線程已經(jīng)釋放了,那么這個線程就會再次去競爭鎖,這就是非公平鎖的體現(xiàn),如果是公平鎖,是沒有這個判斷的。
b. 如果前一個獲得鎖的線程沒有釋放鎖,那么就判斷是否是同一個線程,是的話就會將 state 加 1。這個就是重入鎖的體現(xiàn)。
c. 如果都不滿足,那么返回 false。
acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) ,再次獲取鎖沒有成功,并且又不是可重入鎖,那么就存入一個阻塞隊列里面。里面還有一點邏輯,就不展開了,有興趣可以自己看下。
selfInterrupt(); 這個是當前線程的中斷標志,作用就是在線程在阻塞的是否,客戶端通過調用了中斷線程的方法 interrupt(),那么該線程被喚醒的時候,就會有響應的處理。具體要看這個線程 run 方法里面的代碼邏輯。
2.4 unlock()
protected final boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free = false; if (c == 0) { free = true; setExclusiveOwnerThread(null); } setState(c); return free; }state - 1,如果大于0,說明釋放的是重入鎖,只需要修改 state 就行了
如果等于0,說明要釋放鎖,釋放鎖首先需要把獨占線程設置為null,再把state設置為0。
感謝各位的閱讀,以上就是“如何理解ReentrantLock非公平鎖源碼”的內容了,經(jīng)過本文的學習后,相信大家對如何理解ReentrantLock非公平鎖源碼這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!
網(wǎng)站標題:如何理解ReentrantLock非公平鎖源碼
文章路徑:http://www.chinadenli.net/article48/ggphep.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、面包屑導航、用戶體驗、微信公眾號、網(wǎng)站改版、外貿(mào)網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)