日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java.util.concurrent.locks.Lock 接口 源码

發(fā)布時間:2024/1/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java.util.concurrent.locks.Lock 接口 源码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

相關(guān)類圖:

java.util.concurrent.locks.Lock 源碼:?

package java.util.concurrent.locks;import java.util.concurrent.TimeUnit;public interface Lock {void lock();void lockInterruptibly() throws InterruptedException;boolean tryLock();boolean tryLock(long time, TimeUnit unit) throws InterruptedException;void unlock();Condition newCondition(); }

接口 Lock

所有已知實(shí)現(xiàn)類:

????ReentrantLock,

????ReentrantReadWriteLock.ReadLock,?

????ReentrantReadWriteLock.WriteLock

? Lock?實(shí)現(xiàn)提供了比使用?synchronized?方法和語句可獲得的更廣泛的鎖定操作。此實(shí)現(xiàn)允許更靈活的結(jié)構(gòu),可以具有差別很大的屬性,可以支持多個相關(guān)的?Condition?對象。

????鎖是控制多個線程對共享資源進(jìn)行訪問的工具。通常,鎖提供了對共享資源的獨(dú)占訪問。一次只能有一個線程獲得鎖,對共享資源的所有訪問都需要首先獲得鎖。不過,某些鎖可能允許對共享資源并發(fā)訪問,如?ReadWriteLock?的讀鎖。

? synchronized?方法或語句的使用提供了對與每個對象相關(guān)的隱式監(jiān)視器鎖的訪問,但卻強(qiáng)制所有鎖獲取和釋放均要出現(xiàn)在一個塊結(jié)構(gòu)中:當(dāng)獲取了多個鎖時,它們必須以相反的順序釋放,且必須在與所有鎖被獲取時相同的詞法范圍內(nèi)釋放所有鎖。

????雖然?synchronized?方法和語句的范圍機(jī)制使得使用監(jiān)視器鎖編程方便了很多,而且還幫助避免了很多涉及到鎖的常見編程錯誤,但有時也需要以更為靈活的方式使用鎖。例如,某些遍歷并發(fā)訪問的數(shù)據(jù)結(jié)果的算法要求使用 "hand-over-hand" 或 "chain locking":獲取節(jié)點(diǎn) A 的鎖,然后再獲取節(jié)點(diǎn) B 的鎖,然后釋放 A 并獲取 C,然后釋放 B 并獲取 D,依此類推。Lock?接口的實(shí)現(xiàn)允許鎖在不同的作用范圍內(nèi)獲取和釋放,并允許以任何順序獲取和釋放多個鎖,從而支持使用這種技術(shù)。

????隨著靈活性的增加,也帶來了更多的責(zé)任。不使用塊結(jié)構(gòu)鎖就失去了使用?synchronized?方法和語句時會出現(xiàn)的鎖自動釋放功能。在大多數(shù)情況下,應(yīng)該使用以下語句:

???? Lock l = ...;
???? l.lock();
???? try {
???????? // access the resource protected by this lock
???? } finally {
???????? l.unlock();
???? }
?

????鎖定和取消鎖定出現(xiàn)在不同作用范圍中時,必須謹(jǐn)慎地確保保持鎖定時所執(zhí)行的所有代碼用 try-finally 或 try-catch 加以保護(hù),以確保在必要時釋放鎖。

? Lock?實(shí)現(xiàn)提供了使用?synchronized?方法和語句所沒有的其他功能,包括提供了一個非塊結(jié)構(gòu)的獲取鎖嘗試 (tryLock())、一個獲取可中斷鎖的嘗試 (lockInterruptibly()) 和一個獲取超時失效鎖的嘗試 (tryLock(long, TimeUnit))。

? Lock?類還可以提供與隱式監(jiān)視器鎖完全不同的行為和語義,如保證排序、非重入用法或死鎖檢測。如果某個實(shí)現(xiàn)提供了這樣特殊的語義,則該實(shí)現(xiàn)必須對這些語義加以記錄。

? ? 注意,Lock?實(shí)例只是普通的對象,其本身可以在?synchronized?代碼塊中作為目標(biāo)使用。為了避免混淆,建議除了在其自身的實(shí)現(xiàn)中之外,決不要在synchronized代碼塊中使用?Lock?實(shí)例作為鎖對象。

方法摘要

?voidlock()?
??????????獲取鎖。
?voidlockInterruptibly()?
??????????如果當(dāng)前線程未被中斷,則獲取鎖。
?ConditionnewCondition()?
??????????返回綁定到此?Lock?實(shí)例的新?Condition?實(shí)例。
?booleantryLock()?
??????????僅在調(diào)用時鎖為空閑狀態(tài)才獲取該鎖。
?booleantryLock(long?time,?TimeUnit?unit)?
??????????如果鎖在給定的等待時間內(nèi)空閑,并且當(dāng)前線程未被中斷,則獲取鎖。
?voidunlock()?
??????????釋放鎖。

?

lock

void lock()

????獲取鎖。如果鎖不可用,出于線程調(diào)度目的,將禁用當(dāng)前線程,并且在獲得鎖之前,該線程將一直處于休眠狀態(tài)。

?

lockInterruptibly

void lockInterruptibly() throws InterruptedException

????如果當(dāng)前線程未被?中斷,則獲取鎖。

????如果鎖可用,則獲取鎖,并立即返回。

????如果鎖不可用,出于線程調(diào)度目的,將禁用當(dāng)前線程,并且在發(fā)生以下兩種情況之一以前,該線程將一直處于休眠狀態(tài):

  • 鎖由當(dāng)前線程獲得,線程會被返回繼續(xù)執(zhí)行
  • 其他線程中斷當(dāng)前線程,會拋出InterruptedException,并清除當(dāng)前線程的已中斷狀態(tài)。

????拋出:

????InterruptedException?- 如果在獲取鎖時,當(dāng)前線程被中斷(需要當(dāng)前線程支持對鎖獲取的中斷)。

?

tryLock

boolean tryLock()

????僅在調(diào)用時鎖為空閑狀態(tài)才獲取該鎖。

????如果鎖可用,則獲取鎖,并立即返回值?true。如果鎖不可用,則此方法將立即返回值?false。

????此方法的典型使用語句如下:

????? Lock lock = ...;
????? if (lock.tryLock()) {
????????? try {
????????????? // manipulate protected state
????????? } finally {
????????????? lock.unlock();
????????? }
????? } else {
????????? // perform alternative actions
????? }
?

????此用法可確保如果獲取了鎖,則會釋放鎖,如果未獲取鎖,則不會試圖將其釋放。

????返回:

????????如果獲取了鎖,則返回?true;否則返回?false。

?

tryLock

boolean tryLock(long?time, TimeUnit?unit) throws InterruptedException

????如果鎖在給定的等待時間內(nèi)空閑,并且當(dāng)前線程未被中斷,則獲取鎖。

????如果鎖可用,則此方法將立即返回值?true。

????如果鎖不可用,出于線程調(diào)度目的,將禁用當(dāng)前線程,并且在發(fā)生以下三種情況之一前,該線程將一直處于休眠狀態(tài):

  • 鎖由當(dāng)前線程獲得,此時當(dāng)前線程不再休眠,立即返回值?true;
  • 其他某個線程中斷當(dāng)前線程,并且當(dāng)前線程支持對鎖獲取的中斷,則將拋出?InterruptedException,并會清除當(dāng)前線程的已中斷狀態(tài);
  • 已超過指定的等待時間,此時當(dāng)前線程不再休眠,立即返回值?false。如果 time 小于等于 0,該方法將完全不等待。

????參數(shù):

????time?- 等待鎖的最長時間

????unit?-?time?參數(shù)的時間單位

????返回:

????????如果在等待時間內(nèi)獲得了鎖,則返回?true;如果在獲取鎖前超過了等待時間,則返回?false

????拋出:

????InterruptedException?- 如果在獲取鎖時,當(dāng)前線程被中斷(需要當(dāng)前線程支持對鎖獲取的中斷)

?

unlock

void unlock()

????釋放鎖。通常只有鎖的保持者可以釋放它,如果違背了這個限制,可能會拋出(未經(jīng)檢查的)異常。

?

newCondition

Condition newCondition()

????返回綁定到此?Lock?實(shí)例的新?Condition?實(shí)例。

????在等待條件前,鎖必須由當(dāng)前線程保持。調(diào)用?Condition.await()?將在等待前以原子方式釋放鎖,并在等待返回前重新獲取鎖。

????返回:

????????用于此?Lock?實(shí)例的新?Condition?實(shí)例

????拋出:

????UnsupportedOperationException?- 如果此?Lock?實(shí)現(xiàn)不支持條件

轉(zhuǎn)載于:https://my.oschina.net/langwanghuangshifu/blog/2874912

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的java.util.concurrent.locks.Lock 接口 源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。