您可能不知道的五个高级Java同步器
生活随笔
收集整理的這篇文章主要介紹了
您可能不知道的五个高级Java同步器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
除了基于每個Java對象具有的鎖定位的通用同步外,您還可以使用Java中更復雜的同步器,例如:
- 信號量 –使用許可的概念表示一個位置中允許的最大線程數。 當使用值1時,其行為類似于同步,也稱為二進制信號量。 但是,這里有很大的不同,您在信號量上獲得許可,而不是鎖定對象,它只是一個變量,用于在線程獲得許可時進行計數,而在線程釋放許可時進行計數。 您真正擁有的唯一東西是線程鎖定,直到獲得許可為止。 在下面的示例中,我們將3定義為允許數量,因此在3 獲得之后 ,4線程將等待釋放,然后繼續執行。
- CountDownLatch –用一個數字初始化該類(倒數),當達到0時,線程等待解除阻塞并遵循其方式。 (在等待之后 ,閂鎖無法重復使用)
- CyclicBarrier –此類的行為與CountDownLatch相反。 在N await()之后 ,被阻塞的線程可以按照自己的方式行事。 (可以重用CyclicBarrier)
- 移相器 –非常復雜的同步器,由CountDownLatch和CyclicBarrier混合而成,具有許多自定義選項。 如果您需要一種類似于2個以前的同步器的行為,但是它們還不夠,那么您想深入研究一下。 它的行為類似于CyclicBarrier,但是您可以注冊一組線程并隨時注銷,以實現其他同步器無法實現的自定義級別。 考慮是否需要等待線程到達才能繼續或啟動另一組任務。 在Oracle網站上有關此的更多信息:
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Phaser.html
void runTasks(List<Runnable> tasks) {// Initialize the phaser, "1" to register selffinal Phaser phaser = new Phaser(1); // create and start threadsfor (final Runnable task : tasks) {// register herephaser.register();new Thread() {public void run() {// await all creationphaser.arriveAndAwaitAdvance(); task.run();}}.start();}// allow threads to start and deregister selfphaser.arriveAndDeregister();}- Exchanger –最好的解釋來自Oracle文檔本身: “一個同步點,線程可以在該同步點之間成對并交換成對的元素 ”。 一個線程要向其他線程發送信息,并等待發送數據的塊,而在EXCHANGE中接收另一個線程也要發送的信息! 這種行為發生在雙方!
翻譯自: https://www.javacodegeeks.com/2013/05/five-advanced-java-synchronizers-you-probably-dont-know.html
總結
以上是生活随笔為你收集整理的您可能不知道的五个高级Java同步器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查房子备案怎么查询不到(查房子备案怎么查
- 下一篇: 安卓 无线显示器(安卓 无线显示)