免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

干貨,深入剖析ReentrantLock源碼,推薦收藏

ReentrantLock和Synchronized都是Java開發(fā)中最常用的鎖,與Synchronized這種JVM內(nèi)置鎖不同的是,ReentrantLock提供了更豐富的語義 ??梢詣?chuàng)建公平鎖或非公平鎖、響應(yīng)中斷、超時(shí)等待、按條件喚醒等 。在某些場景下,使用ReentrantLock更適合,功能更強(qiáng)大 。
前兩篇文章,我們分析了AQS的加鎖流程、以及源碼實(shí)現(xiàn) 。當(dāng)時(shí)我們就說了,AQS使用了模板設(shè)計(jì)模式,父類中定義加鎖流程,子類去實(shí)現(xiàn)具體的加鎖邏輯 。所以大部分加鎖代碼已經(jīng)在父類AQS中實(shí)現(xiàn)了,導(dǎo)致ReentrantLock的源碼非常簡單,一塊學(xué)習(xí)一下 。
先看一下ReentrantLock怎么使用?
1. ReentrantLock的使用/** * @author 一燈架構(gòu) * @apiNote ReentrantLock示例 **/public class ReentrantLockDemo {public static void main(String[] args) {// 1. 創(chuàng)建ReentrantLock對象ReentrantLock lock = new ReentrantLock();// 2. 加鎖lock.lock();try {// 3. 這里執(zhí)行具體的業(yè)務(wù)邏輯} finally {// 4. 釋放鎖lock.unlock();}}}可以看到ReentrantLock的使用非常簡單,調(diào)用lock加鎖,unlock釋放鎖,需要配置try/finally使用,保證在代碼執(zhí)行出錯(cuò)的時(shí)候也能釋放鎖 。
ReentrantLock也可以配合Condition條件使用,具體可以翻一下前幾篇文章中BlockingQueue的源碼解析,那里面有ReentrantLock的實(shí)際使用 。
再看一下ReentrantLock的類結(jié)構(gòu)
2. ReentrantLock類結(jié)構(gòu)// 實(shí)現(xiàn)Lock接口public class ReentrantLock implements Lock {// 只有一個(gè)Sync同步變量private final Sync sync;// Sync繼承自AQS,主要邏輯都在這里面abstract static class Sync extends AbstractQueuedSynchronizer {}// Sync的兩個(gè)子類,分別實(shí)現(xiàn)了公平鎖和非公平鎖static final class FairSync extends Sync {}static final class NonfairSync extends Sync {}}可以看出ReentrantLock的類結(jié)構(gòu)非常簡單,實(shí)現(xiàn)了Lock接口 。
類里面有兩個(gè)靜態(tài)內(nèi)部類,分別實(shí)現(xiàn)公平鎖和非公平鎖 。
看一下Lock接口中,定義了哪些方法?
public interface Lock {// 加鎖void lock();// 加可中斷的鎖void lockInterruptibly() throws InterruptedException;// 嘗試加鎖boolean tryLock();// 一段時(shí)間內(nèi),嘗試加鎖boolean tryLock(long time, TimeUnit unit) throws InterruptedException;// 釋放鎖void unlock();// 新建條件狀態(tài)Condition newCondition();}就是一些使用鎖的常用方法 。
在上篇文章中瀏覽AQS源碼的時(shí)候,了解到AQS定義了一些有關(guān)具體加鎖、釋放鎖的抽象方法,留給子類去實(shí)現(xiàn),再看一下有哪些抽象方法:
// 加獨(dú)占鎖protected boolean tryAcquire(int arg) {throw new UnsupportedOperationException();}// 釋放獨(dú)占鎖protected boolean tryRelease(int arg) {throw new UnsupportedOperationException();}// 加共享鎖protected int tryAcquireShared(int arg) {throw new UnsupportedOperationException();}// 釋放共享鎖protected boolean tryReleaseShared(int arg) {throw new UnsupportedOperationException();}// 判斷是否是當(dāng)前線程正在持有鎖protected boolean isHeldExclusively() {throw new UnsupportedOperationException();}由于ReentrantLock使用的是獨(dú)占鎖,所以只需要實(shí)現(xiàn)獨(dú)占鎖相關(guān)的方法就可以了 。
3. ReentrantLock源碼解析3.1 ReentrantLock構(gòu)造方法// 默認(rèn)的構(gòu)造方法,使用非公平鎖public ReentrantLock() {sync = new NonfairSync();}// 傳true,可以指定使用公平鎖public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();}在創(chuàng)建ReentrantLock對象的時(shí)候,可以指定使用公平鎖還是非公平鎖,默認(rèn)使用非公平鎖,顯然非公平鎖的性能更好 。
先思考一個(gè)面試常考問題,公平鎖和非公平鎖是怎么實(shí)現(xiàn)的?
3.2 非公平鎖源碼先看一下加鎖源碼:
【干貨,深入剖析ReentrantLock源碼,推薦收藏】從父類ReentrantLock的加鎖方法入口:

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀