第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

aqs速讀

標(biāo)簽:
Java

说起aqs很多人都感觉很头疼,下文就从几个角度了解,让你快速了解aqs。

预热知识

aqs获取锁等主要用的cas以及locksupport。对锁的控制是一个int类型的状态state。例如获取锁就是通过cas把state从0变成1。

独占锁

图片描述
3个线程都去修改状态,cas只有一个修改成功。剩下的都会失败,并且开始进入一个队列中。
图片描述
线程2,加入队列后,就会判断自己是否可以去抢锁(只有pre是head的才可以抢锁),如果抢不到,就用locksupport挂起。线程3也一样。此时线程2和3都是挂起状态。
图片描述
当1释放锁。释放的过程就是修改状态,例如把1改成0。然后利用locksupport唤醒head的下一个节点。此时2被唤醒再次重复抢锁,失败挂起的流程。

公平锁

经过上面的流程,大家也发现了一个问题,就是修改状态和唤醒节点,不是一个原子操作,如果我刚释放,正好就被一个新的进程修改成功,线程2尝试获取锁是失败的。这就是非公平锁。公平锁,在改状态之前,会先判断一下,等待的队列的头指针和尾指针是否相同(队列是否为空)。这样就保证了队列里的线程有比较高的优先级拿到锁。

重入锁

重入锁就是当前线程已经获取锁了,再次获取锁的时候就可以不用拍在队列里。这个逻辑也是在获取锁的地方判定的,获取锁的时候,判定一下正在拿到锁的线程是否是当前线程。如果是就在状态上+1。释放锁的时候也是+1。直到减到0,才去唤醒阻塞的线程。

共享锁

共享锁其实是多个线程可以同时拿到锁的。流程状态与独占锁没有区别,在阻塞队列里获取锁的时候多了一些操作。释放资源的时候还是唤醒head的下一个节点,那么在共享锁里,就存在一种情况,多个线程同时释放资源唤醒的都是head的next,如果此时只有一个节点获取锁的话,那么资源就浪费了。所以,共享锁在之前的逻辑上多了一步,就是获取锁资源以后,会判断是否还有锁资源。如果有,就再走一次释放锁资源的过程。让后续的节点继续获取资源。

小结

对于aqs。主流程就是,尝试获取锁资源,失败入队列,再次获取锁,失败后,等待被唤醒,唤醒后继续获取锁资源,然后根据锁的类型再处理情况。

點擊查看更多內(nèi)容
3人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
JAVA開發(fā)工程師
手記
粉絲
1.6萬
獲贊與收藏
380

關(guān)注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消