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