同步器 java_您可能不知道的五个高级Java同步器
生活随笔
收集整理的這篇文章主要介紹了
同步器 java_您可能不知道的五个高级Java同步器
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
同步器 java
除了基于每個Java對象具有的鎖定位的通用同步外,您還可以使用Java中更復(fù)雜的同步器,例如:
- 信號量 –使用許可的概念表示一個位置中允許的最大線程數(shù)。 當(dāng)使用值1時,其行為類似于同步,也稱為二進(jìn)制信號量。 但是,這里有很大的不同,您在信號量上獲得許可,而不是鎖定對象,它只是一個變量,用于在線程獲得許可時進(jìn)行計數(shù),而在線程釋放許可時進(jìn)行計數(shù)。 您真正擁有的唯一東西是線程鎖定,直到獲得許可為止。 在下面的示例中,我們將3定義為允許的數(shù)量,因此在3 獲得之后 ,4線程將等待釋放,然后繼續(xù)執(zhí)行。
- CountDownLatch –用一個數(shù)字初始化該類(倒數(shù)),當(dāng)達(dá)到0時,線程等待解除阻塞并遵循其方式。 (在等待之后 ,閂鎖無法重復(fù)使用)
- CyclicBarrier –此類的行為與CountDownLatch相反。 在N await()之后 ,被阻塞的線程可以按照自己的方式進(jìn)行。 (可以重用CyclicBarrier)
- 移相器 –非常復(fù)雜的同步器,由CountDownLatch和CyclicBarrier混合而成,具有許多自定義選項。 如果您需要一個類似于2個以前的同步器的行為,但是它們還不夠,那么您想深入研究一下這個同步器。 它的行為類似于CyclicBarrier,但是您可以注冊一組線程并隨時注銷,以實現(xiàn)其他同步器無法實現(xiàn)的自定義級別。 考慮是否需要等待線程到達(dá),然后才能繼續(xù)或啟動另一組任務(wù)。 在Oracle網(wǎng)站上有關(guān)此的更多信息:
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 –最好的解釋來自O(shè)racle文檔本身: “一個同步點(diǎn),線程可以在該同步點(diǎn)進(jìn)行配對并在配對中交換元素 ”。 一個線程想將信息發(fā)送到另一個線程并阻塞等待發(fā)送數(shù)據(jù),而在EXCHANGE中也接收另一個線程想發(fā)送的信息! 雙方都會發(fā)生這種行為!
翻譯自: https://www.javacodegeeks.com/2013/05/five-advanced-java-synchronizers-you-probably-dont-know.html
同步器 java
總結(jié)
以上是生活随笔為你收集整理的同步器 java_您可能不知道的五个高级Java同步器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10系统防火墙怎么打开如何打开电脑
- 下一篇: java 断点_每个Java开发人员应拥