您好,登錄后才能下訂單哦!
Lock和Synchronizer有什么關系,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Synchronizer,它是一個根據自身狀態調節線程執行的對象。就是用來協調(多)線程執行的對象。從這個角度講Java的內置鎖就是一種synchronizer,它以互斥的可重入的方式協調/控制線程的執行。
Java的阻塞隊列也是一種synchronizser。
再比如:信號量Semaphore、閉鎖Latch、關卡Barrier都是不同類型的synchronizer。
信號量
Semaphore可以用來控制同時訪問某資源的線程數量。把對這些資源的獲取操作包裝起來,獲取資源前先調用信號量的acquire()申請許可,資源使用使用完畢后通過release()釋放許可。對池化資源的管理一般可用信號量完成。
閉鎖
英文Latch有門閂的意思,門閂就是用來把門關緊不讓出入。在并發編程里也是這個意思,我們用latch這個對象禁止線程的執行,什么時候允許線程通過這個門閂呢?對于CountDownLatch來說,就是計數變為0的時候。對于FutureTask來說就是可以拿到計算結果的時候(當然也可能是計算異常了)。一個應用場景:可以把閉鎖當作一個發令槍,它可以讓線程等到信號后一起運行。
關卡
Barrier中文就是“障礙物、柵欄”的意思,文縐縐的翻譯就是“關卡”。它其實像極了閉鎖,與閉鎖不同的是:閉鎖等待的是事件,而關卡等待的是線程。從API調用的感覺感覺上講,Barrier是在工作線程正兒八經的工作都執行完畢后(取決于業務場景),調用barrier.await()使工作線程阻塞住,直到所有其它工作線程也都完成個各自的任務并都調用了barrier.await(),這個時候關卡就被沖破。這里等待的條件是有足夠的線程調用barrier.await()。而Latch是在工作線程中調用latch.await(),等待閉鎖被開啟來執行。閉鎖是怎樣被開啟的?它是依靠latch.countDown()到0后被開啟的,誰countdown跟哪個線程沒什么直接關系。而barrier.await()是需要實實在在的線程阻塞,這就是為什么說barrier等待的是線程,latch等的是信號。
經常使用關卡到場景是,一個任務分成n個子任務后,等待這n個子任務都完成后再做下一步工作。
CyclicBarrier的構造函數接受一個線程數以及一個關卡被突破后要執行的動作。
Exchanger是另一種關卡,用來為兩個線程交換數據,當然是以線程安全的方式交換。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。