Java 多執行緒程式設計核心技術4 Lock

2021-09-14 03:20:36 字數 2017 閱讀 2032

呼叫lock.lock()**的執行緒就持有了「物件監視器」,其他執行緒只有等待鎖被釋放時再次爭搶。效果和使用synchronized關鍵字一樣,執行緒之間執行的順序是隨機的。

呼叫reentrantlock物件的lock()方法獲取鎖,呼叫unlock()方法釋放鎖。

condition類具有更好的靈活性,比如可以實現多路通知功能,也就是在乙個lock物件裡可以建立多個condition(即物件監視器)例項,執行緒物件可以註冊在指定的conditionzhong,從而可以有選擇性地進行執行緒通知,在排程上更加靈活。

使用reentrantlock結合condition類是可以實現前面介紹過的「選擇性通知」,這個功能是非常重要的,而且在conditon類中預設提供的。

異常illegalmonitorstateexception是監視器出錯,解決的辦法是必須在condition.await()方法呼叫之前呼叫lock.lock()**獲取同步監視器。

呼叫了condition物件的await()方法,使當前執行任務的執行緒進入了等待waiting狀態。

object類中的wait()方法相當於condition類中的await()方法。

objcet類中的wait(long)方法相當於condition類中的await(long,timeuni)

objcet類中的notify()方法相當於condition類中的signal()方法。

objcet類中的notifyall()方法相當於condition類中的signalall()方法。

使用多個condition物件,可以喚醒部分指定執行緒,有助於提公升程式執行的效率。可以先對執行緒進行分組,然後再喚醒指定組中的執行緒。

使用reentrantlock物件可以喚醒指定種類的執行緒,這是控制部分執行緒行為的方便方式。

鎖lock分為「公平鎖」和「非公平鎖」,公平鎖表示執行緒獲取鎖的順序是按照執行緒加鎖的順序來分配的,即先來先得的fifo先進先出順序。而非公平鎖就是一種獲取鎖的搶占機制,是隨機獲取鎖的,和公平鎖不一樣的就是先來的不一定先得到鎖,這種方式可能造成某些執行緒一種拿不到鎖,結果也就是不公平的了。

方法int getholdcount()的作用是查詢當前執行緒保持此鎖定的個數,也就是呼叫lock()方法的次數。

方法int getqueuelength()的作用是返回正等待獲取此鎖定的執行緒估計數。

方法int getwaitqueuelength(condition condition)的作用是返回等待與此鎖定相關給定條件condition的執行緒估計數。

方法boolean hasqueuedthread(thread thread)的作用是查詢指定的執行緒是否正在等待獲取此鎖定。

方法boolean hasqueuedthreads()的作用是查詢是否有執行緒正在等待獲取此鎖定。

方法boolean haswaiters(condition condition)的作用是查詢是否有執行緒正在等待與此鎖定有關的condition條件。

方法boolean isfair()的作用是判斷是不是公平鎖。在預設的情況下,reentrantlock類使用的非公平鎖。

方法boolean isheldbycurrentthread()的作用是查詢當前執行緒是否保持此鎖定。

方法boolean islocked()的作用是查詢此鎖定是否由任意執行緒保持。

方法void lockinterruptibly()的作用是:如果當前執行緒未被中斷,則獲取鎖定,如果已經被中斷則丟擲異常。

方法boolean trylock()的作用是,僅在呼叫時鎖定未被另乙個執行緒保持的情況下,才獲取該鎖定。

方法boolean try(long timeout,timeunit unit)的作用是,如果鎖定在給定等待時間內沒有被另乙個執行緒保持,且當前執行緒未被中斷,則獲取該鎖定。

執行緒在等待時間到達前,可以被其他執行緒提前喚醒。

在某些不需要操作例項變數的方法中,完全可以使用讀寫鎖reentrantreadwritelock來提公升該方法的**執行效率。

在讀寫鎖中,「讀寫」,「寫讀」,和「寫寫」都是互斥的;而「讀讀」是非同步的,非互斥的。

在並發包中大量的類使用了lock介面作為同步的處理方式。

Java多執行緒 程式設計核心技術4Lock

執行緒間同步互斥,且嗅探鎖定 多路分支通知,使用上較synchronized靈活 呼叫該物件的lock 獲取鎖,unlock 釋放鎖 借助condition實現等待 通知模式 condition 物件監視器 是jdk5 靈活性 多路通知 乙個lock物件中建多個condition例項,執行緒物件可以...

《java多執行緒程式設計核心技術》核心筆記 一

執行緒具有優先順序 執行緒的優先順序具有繼承特性。被呼叫者繼承呼叫者的優先順序 優先順序高的執行緒 絕大部分會現執行 方法內的變數是執行緒安全的。多個執行緒訪問同乙個物件的同步方法時,一定是執行緒安全的。synchronized取得的是物件鎖 多個執行緒訪問乙個物件 synchronized 如果乙...

Java多執行緒 程式設計核心技術5 Lock

1 計畫時間早於當前時間,提前執行 2 timertask類的cancel 方法 將自身從任務佇列中清除 3 timer類的cancel方法 清空任務佇列的全部任務 如果該方法沒有搶到鎖,任務還是繼續執行 4 schedule timertask task long delay,long perio...