ReentrantLock介紹
員工經(jīng)過(guò)長(zhǎng)期磨合與沉淀,具備了協(xié)作精神,得以通過(guò)團(tuán)隊(duì)的力量開(kāi)發(fā)出優(yōu)質(zhì)的產(chǎn)品。成都創(chuàng)新互聯(lián)公司堅(jiān)持“專(zhuān)注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩?zhuān)注所以專(zhuān)業(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡(jiǎn)單”。公司專(zhuān)注于為企業(yè)提供網(wǎng)站制作、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、電商網(wǎng)站開(kāi)發(fā),成都微信小程序,軟件按需開(kāi)發(fā)網(wǎng)站等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。ReentrantLock是一個(gè)可重入的互斥鎖,又被稱(chēng)為“獨(dú)占鎖”。
顧名思義,ReentrantLock鎖在同一個(gè)時(shí)間點(diǎn)只能被一個(gè)線(xiàn)程鎖持有;而可重入的意思是,ReentrantLock鎖,可以被單個(gè)線(xiàn)程多次獲取。
ReentrantLock分為“公平鎖”和“非公平鎖”。它們的區(qū)別體現(xiàn)在獲取鎖的機(jī)制上是否公平?!版i”是為了保護(hù)競(jìng)爭(zhēng)資源,防止多個(gè)線(xiàn)程同時(shí)操作線(xiàn)程而出錯(cuò),ReentrantLock在同一個(gè)時(shí)間點(diǎn)只能被一個(gè)線(xiàn)程獲取(當(dāng)某線(xiàn)程獲取到“鎖”時(shí),其它線(xiàn)程就必須等待);ReentraantLock是通過(guò)一個(gè)FIFO的等待隊(duì)列來(lái)管理獲取該鎖所有線(xiàn)程的。在“公平鎖”的機(jī)制下,線(xiàn)程依次排隊(duì)獲取鎖;而“非公平鎖”在鎖是可獲取狀態(tài)時(shí),不管自己是不是在隊(duì)列的開(kāi)頭都會(huì)獲取鎖。
ReentrantLock函數(shù)列表
// 創(chuàng)建一個(gè) ReentrantLock ,默認(rèn)是“非公平鎖”。 ReentrantLock() // 創(chuàng)建策略是fair的 ReentrantLock。fair為true表示是公平鎖,fair為false表示是非公平鎖。 ReentrantLock(boolean fair) // 查詢(xún)當(dāng)前線(xiàn)程保持此鎖的次數(shù)。 int getHoldCount() // 返回目前擁有此鎖的線(xiàn)程,如果此鎖不被任何線(xiàn)程擁有,則返回 null。 protected Thread getOwner() // 返回一個(gè) collection,它包含可能正等待獲取此鎖的線(xiàn)程。 protected CollectiongetQueuedThreads() // 返回正等待獲取此鎖的線(xiàn)程估計(jì)數(shù)。 int getQueueLength() // 返回一個(gè) collection,它包含可能正在等待與此鎖相關(guān)給定條件的那些線(xiàn)程。 protected Collection getWaitingThreads(Condition condition) // 返回等待與此鎖相關(guān)的給定條件的線(xiàn)程估計(jì)數(shù)。 int getWaitQueueLength(Condition condition) // 查詢(xún)給定線(xiàn)程是否正在等待獲取此鎖。 boolean hasQueuedThread(Thread thread) // 查詢(xún)是否有些線(xiàn)程正在等待獲取此鎖。 boolean hasQueuedThreads() // 查詢(xún)是否有些線(xiàn)程正在等待與此鎖有關(guān)的給定條件。 boolean hasWaiters(Condition condition) // 如果是“公平鎖”返回true,否則返回false。 boolean isFair() // 查詢(xún)當(dāng)前線(xiàn)程是否保持此鎖。 boolean isHeldByCurrentThread() // 查詢(xún)此鎖是否由任意線(xiàn)程保持。 boolean isLocked() // 獲取鎖。 void lock() // 如果當(dāng)前線(xiàn)程未被中斷,則獲取鎖。 void lockInterruptibly() // 返回用來(lái)與此 Lock 實(shí)例一起使用的 Condition 實(shí)例。 Condition newCondition() // 僅在調(diào)用時(shí)鎖未被另一個(gè)線(xiàn)程保持的情況下,才獲取該鎖。 boolean tryLock() // 如果鎖在給定等待時(shí)間內(nèi)沒(méi)有被另一個(gè)線(xiàn)程保持,且當(dāng)前線(xiàn)程未被中斷,則獲取該鎖。 boolean tryLock(long timeout, TimeUnit unit) // 試圖釋放此鎖。 void unlock()