溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Lock和Synchronizer有什么關(guān)系

發(fā)布時間:2021-07-30 17:56:09 來源:億速云 閱讀:126 作者:Leah 欄目:互聯(lián)網(wǎng)科技

Lock和Synchronizer有什么關(guān)系,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

Synchronizer,它是一個根據(jù)自身狀態(tài)調(diào)節(jié)線程執(zhí)行的對象。就是用來協(xié)調(diào)(多)線程執(zhí)行的對象。從這個角度講Java的內(nèi)置鎖就是一種synchronizer,它以互斥的可重入的方式協(xié)調(diào)/控制線程的執(zhí)行。

Java的阻塞隊列也是一種synchronizser。

再比如:信號量Semaphore、閉鎖Latch、關(guān)卡Barrier都是不同類型的synchronizer。

信號量

Semaphore可以用來控制同時訪問某資源的線程數(shù)量。把對這些資源的獲取操作包裝起來,獲取資源前先調(diào)用信號量的acquire()申請許可,資源使用使用完畢后通過release()釋放許可。對池化資源的管理一般可用信號量完成。

閉鎖

英文Latch有門閂的意思,門閂就是用來把門關(guān)緊不讓出入。在并發(fā)編程里也是這個意思,我們用latch這個對象禁止線程的執(zhí)行,什么時候允許線程通過這個門閂呢?對于CountDownLatch來說,就是計數(shù)變?yōu)?的時候。對于FutureTask來說就是可以拿到計算結(jié)果的時候(當(dāng)然也可能是計算異常了)。一個應(yīng)用場景:可以把閉鎖當(dāng)作一個發(fā)令槍,它可以讓線程等到信號后一起運行。

關(guān)卡

Barrier中文就是“障礙物、柵欄”的意思,文縐縐的翻譯就是“關(guān)卡”。它其實像極了閉鎖,與閉鎖不同的是:閉鎖等待的是事件,而關(guān)卡等待的是線程。從API調(diào)用的感覺感覺上講,Barrier是在工作線程正兒八經(jīng)的工作都執(zhí)行完畢后(取決于業(yè)務(wù)場景),調(diào)用barrier.await()使工作線程阻塞住,直到所有其它工作線程也都完成個各自的任務(wù)并都調(diào)用了barrier.await(),這個時候關(guān)卡就被沖破。這里等待的條件是有足夠的線程調(diào)用barrier.await()。而Latch是在工作線程中調(diào)用latch.await(),等待閉鎖被開啟來執(zhí)行。閉鎖是怎樣被開啟的?它是依靠latch.countDown()到0后被開啟的,誰countdown跟哪個線程沒什么直接關(guān)系。而barrier.await()是需要實實在在的線程阻塞,這就是為什么說barrier等待的是線程,latch等的是信號。

經(jīng)常使用關(guān)卡到場景是,一個任務(wù)分成n個子任務(wù)后,等待這n個子任務(wù)都完成后再做下一步工作。

CyclicBarrier的構(gòu)造函數(shù)接受一個線程數(shù)以及一個關(guān)卡被突破后要執(zhí)行的動作。

Exchanger是另一種關(guān)卡,用來為兩個線程交換數(shù)據(jù),當(dāng)然是以線程安全的方式交換。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI