在上面一篇分析ThreadExecutedPool的文章中我們看到線程池實現(xiàn)源碼中大量使用了ReentrantLock鎖,那么ReentrantLock鎖的優(yōu)勢是什么?它又是怎么實現(xiàn)的呢?
ReentrantLock又名可重入鎖,為什么稱之為可重入鎖呢?簡單來說因為它允許一個線程多次取獲得該鎖,不過多次獲取該鎖之后,也需要執(zhí)行同樣次數(shù)的釋放鎖操作,否則該鎖將被當前線程一直持有,導致其它線程無法獲取。需要注意的是,釋放鎖的操作需要我們用代碼來控制,它并不會自動取釋放鎖。在ReentrantLock中實現(xiàn)了兩種鎖fairSync和NonfairSync,即公平鎖和非公平鎖,今天我們就來聊聊ReentrantLock中nonfairSync鎖的實現(xiàn)。
廢話不多說,下面開始分析代碼!
1、1 Lock()
首先看一下lock()方法,這個方法非常重要,它也是我們獲取鎖的入口:
final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); }
ReentrantLock鎖的初始狀態(tài)為0,compareAndSetState方法將嘗試獲取鎖并將當前鎖的狀態(tài)設(shè)置為1。如果成功獲取了鎖會調(diào)用setExclusiveOwnerThread()方法設(shè)置當前線程擁有該鎖的獨占訪問權(quán)。
如果調(diào)用compareAndSetState()獲取鎖失敗,則返回false并執(zhí)行acquire(1)。
public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); }
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26