java reentrantlock是什么?一起來看下吧:
是一個(gè)可重入且獨(dú)占式的鎖,它具有與使用synchronized監(jiān)視器鎖相同的基本行為和語義,但與synchronized關(guān)鍵字相比,它更靈活、更強(qiáng)大,增加了輪詢、超時(shí)、中斷等高級(jí)功能。ReentrantLock,顧名思義,它是支持可重入鎖的鎖,是一種遞歸無阻塞的同步機(jī)制。除此之外,該鎖還支持獲取鎖時(shí)的公平和非公平選擇。
ReentrantLock的內(nèi)部類Sync繼承了AQS,分為公平鎖FairSync和非公平鎖NonfairSync。如果在絕對(duì)時(shí)間上,先對(duì)鎖進(jìn)行獲取的請(qǐng)求你一定先被滿足,那么這個(gè)鎖是公平的,反之,是不公平的。公平鎖的獲取,也就是等待時(shí)間最長的線程最優(yōu)先獲取鎖,也可以說鎖獲取是順序的。ReentrantLock的公平與否,可以通過它的構(gòu)造函數(shù)來決定。
事實(shí)上,公平鎖往往沒有非公平鎖的效率高,但是,并不是任何場景都是以TPS作為唯一指標(biāo),公平鎖能夠減少“饑餓”發(fā)生的概率,等待越久的請(qǐng)求越能夠得到優(yōu)先滿足。
ReentrantLock是通過自定義同步器來實(shí)現(xiàn)鎖的獲取與釋放,我們以非公平鎖(默認(rèn))實(shí)現(xiàn)為例,對(duì)鎖的獲取和釋放進(jìn)行詳解。
獲取鎖:
public?ReentrantLock()?{ ????sync?=?new?NonfairSync(); }
即內(nèi)部同步組件為非公平鎖,獲取鎖的代碼為:
public?void?lock()?{ ????sync.lock(); }
釋放鎖:
成功獲取鎖的線程在完成業(yè)務(wù)邏輯之后,需要調(diào)用unlock()來釋放鎖:
public?void?unlock()?{ ????sync.release(1); }
unlock()調(diào)用NonfairSync類的release(int)方法釋放鎖,release(int)方法是定義在AQS中的方法:
public?final?boolean?release(int?arg)?{ ????if?(tryRelease(arg))?{ ????????Node?h?=?head; ????????if?(h?!=?null?&&?h.waitStatus?!=?0) ????????????unparkSuccessor(h); ????????return?true; ????} ????return?false; }
tryRelease(int)是子類需要實(shí)現(xiàn)的方法:
protected?final?boolean?tryRelease(int?releases)?{ ????//?計(jì)算新的狀態(tài)值 ????int?c?=?getState()?-?releases; ????//?判斷當(dāng)前線程是否是持有鎖的線程,如果不是的話,拋出異常 ????if?(Thread.currentThread()?!=?getExclusiveOwnerThread()) ????????throw?new?IllegalMonitorStateException(); ????boolean?free?=?false; ????//?新的狀態(tài)值是否為0,若為0,則表示該鎖已經(jīng)完全釋放了,其他線程可以獲取同步狀態(tài)了 ????if?(c?==?0)?{ ????????free?=?true; ????????setExclusiveOwnerThread(null); ????} ????//?更新狀態(tài)值 ????setState(c); ????return?free; }
如果該鎖被獲取n次,那么前(n-1)次tryRelease(int)方法必須返回false,只有同步狀態(tài)完全釋放了,才能返回true??梢钥吹?,該方法將同步狀態(tài)是否為0作為最終釋放的條件,當(dāng)狀態(tài)為0時(shí),將占有線程設(shè)為null,并返回true,表示釋放成功。
以上就是小編今天的分享,希望可以幫助到大家。