摘要:調(diào)用代碼的線程就持有了對象監(jiān)視器,其他線程只有等待鎖被釋放時再次爭搶。使用多個對象,可以喚醒部分指定線程,有助于提升程序運行的效率。方法的作用是返回等待與此鎖定相關(guān)給定條件的線程估計數(shù)。線程在等待時間到達前,可以被其他線程提前喚醒。
調(diào)用lock.lock()代碼的線程就持有了“對象監(jiān)視器”,其他線程只有等待鎖被釋放時再次爭搶。效果和使用synchronized關(guān)鍵字一樣,線程之間執(zhí)行的順序是隨機的。
調(diào)用ReentrantLock對象的lock()方法獲取鎖,調(diào)用unlock()方法釋放鎖。
Condition類具有更好的靈活性,比如可以實現(xiàn)多路通知功能,也就是在一個Lock對象里可以創(chuàng)建多個Condition(即對象監(jiān)視器)實例,線程對象可以注冊在指定的Conditionzhong,從而可以有選擇性地進行線程通知,在調(diào)度上更加靈活。
使用ReentrantLock結(jié)合Condition類是可以實現(xiàn)前面介紹過的“選擇性通知”,這個功能是非常重要的,而且在Conditon類中默認提供的。
異常IllegalMonitorStateException是監(jiān)視器出錯,解決的辦法是必須在condition.await()方法調(diào)用之前調(diào)用lock.lock()代碼獲取同步監(jiān)視器。
調(diào)用了Condition對象的await()方法,使當前執(zhí)行任務的線程進入了等待waiting狀態(tài)。
Object類中的wait()方法相當于Condition類中的await()方法。
Objcet類中的wait(long)方法相當于Condition類中的await(long,timeUni)
Objcet類中的notify()方法相當于Condition類中的signal()方法。
Objcet類中的notifyAll()方法相當于Condition類中的signalAll()方法。
使用多個Condition對象,可以喚醒部分指定線程,有助于提升程序運行的效率??梢韵葘€程進行分組,然后再喚醒指定組中的線程。
使用ReentrantLock對象可以喚醒指定種類的線程,這是控制部分線程行為的方便方式。
鎖Lock分為“公平鎖”和“非公平鎖”,公平鎖表示線程獲取鎖的順序是按照線程加鎖的順序來分配的,即先來先得的FIFO先進先出順序。而非公平鎖就是一種獲取鎖的搶占機制,是隨機獲取鎖的,和公平鎖不一樣的就是先來的不一定先得到鎖,這種方式可能造成某些線程一種拿不到鎖,結(jié)果也就是不公平的了。
方法int getHoldCount()的作用是查詢當前線程保持此鎖定的個數(shù),也就是調(diào)用lock()方法的次數(shù)。
方法int getQueueLength()的作用是返回正等待獲取此鎖定的線程估計數(shù)。
方法int getWaitQueueLength(Condition condition)的作用是返回等待與此鎖定相關(guān)給定條件Condition的線程估計數(shù)。
方法boolean hasQueuedThread(Thread thread)的作用是查詢指定的線程是否正在等待獲取此鎖定。
方法boolean hasQueuedThreads()的作用是查詢是否有線程正在等待獲取此鎖定。
方法boolean hasWaiters(Condition condition)的作用是查詢是否有線程正在等待與此鎖定有關(guān)的condition條件。
方法boolean isFair()的作用是判斷是不是公平鎖。在默認的情況下,ReentrantLock類使用的非公平鎖。
方法boolean isHeldByCurrentThread()的作用是查詢當前線程是否保持此鎖定。
方法boolean isLocked()的作用是查詢此鎖定是否由任意線程保持。
方法void lockInterruptibly()的作用是:如果當前線程未被中斷,則獲取鎖定,如果已經(jīng)被中斷則拋出異常。
方法boolean tryLock()的作用是,僅在調(diào)用時鎖定未被另一個線程保持的情況下,才獲取該鎖定。
方法boolean try(long timeout,TimeUnit unit)的作用是,如果鎖定在給定等待時間內(nèi)沒有被另一個線程保持,且當前線程未被中斷,則獲取該鎖定。
線程在等待時間到達前,可以被其他線程提前喚醒。
在某些不需要操作實例變量的方法中,完全可以使用讀寫鎖ReentrantReadWriteLock來提升該方法的代碼運行效率。
在讀寫鎖中,“讀寫”,“寫讀”,和“寫寫”都是互斥的;而“讀讀”是異步的,非互斥的。
在并發(fā)包中大量的類使用了Lock接口作為同步的處理方式。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/68207.html
摘要:使用工具監(jiān)測死鎖進入的安裝目錄中的目錄,執(zhí)行命令可以看出得到運行的線程的值為,再執(zhí)行命令,查看結(jié)果 死鎖 Java 線程是死鎖是一個經(jīng)典的多線程問題,因為不同的線程都在等待根本不可能被釋放的鎖,從而導致所有的任務都無法繼續(xù)完成 舉個例子 DealThread.java package dealThread.demo; public class DealThread implement...
摘要:底層是是通過對象,對象有自己的對象頭,存儲了很多信息,其中一個信息標示是被哪個線程持有。當一個線程執(zhí)行的代碼出現(xiàn)異常時,其所持有的鎖會自動釋放。 前言 回顧前面: 多線程三分鐘就可以入個門了! Thread源碼剖析 多線程基礎(chǔ)必要知識點!看了學習多線程事半功倍 只有光頭才能變強! 本文章主要講的是Java多線程加鎖機制,有兩種: Synchronized 顯式Lock 不得不嘮...
摘要:在兩個線程訪問同一個對象中的同步方法時一定是線程安全的。當一個線程訪問的一個同步代碼塊時,其他線程對同一個鐘所有其他同步代碼塊的訪問被阻塞,這說明使用的對象監(jiān)視器是一個。 非線程安全其實會在多個線程對同一個對象中的實例變量進行并發(fā)訪問時發(fā)生,產(chǎn)生的后果就是臟讀,也就是取到的數(shù)據(jù)其實是被更改過的。而線程安全就是以獲得的實例變量的值是經(jīng)過同步處理的,不會出現(xiàn)臟讀的現(xiàn)象。 非線程安全問題存...
摘要:語言在之前,提供的唯一的并發(fā)原語就是管程,而且之后提供的并發(fā)包,也是以管程技術(shù)為基礎(chǔ)的。但是管程更容易使用,所以選擇了管程。線程進入條件變量的等待隊列后,是允許其他線程進入管程的。并發(fā)編程里兩大核心問題互斥和同步,都可以由管程來幫你解決。 并發(fā)編程這個技術(shù)領(lǐng)域已經(jīng)發(fā)展了半個世紀了。有沒有一種核心技術(shù)可以很方便地解決我們的并發(fā)問題呢?這個問題, 我會選擇 Monitor(管程)技術(shù)。Ja...
摘要:運行可運行狀態(tài)的線程獲得了時間片,執(zhí)行程序代碼。阻塞的情況分三種一等待阻塞運行的線程執(zhí)行方法,會把該線程放入等待隊列中。死亡線程方法執(zhí)行結(jié)束,或者因異常退出了方法,則該線程結(jié)束生命周期。死亡的線程不可再次復生。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關(guān)鍵字(1) java多線程學習(二)synchronized關(guān)鍵...
閱讀 2784·2023-04-25 17:58
閱讀 3045·2021-11-15 11:38
閱讀 2453·2021-11-02 14:48
閱讀 1263·2021-08-25 09:40
閱讀 1902·2019-08-30 15:53
閱讀 1162·2019-08-30 15:52
閱讀 1082·2019-08-30 13:55
閱讀 2506·2019-08-29 15:21