2012-08-23 29 views
5

我需要喚醒或發送睡眠單一線程有時,我想知道什麼是最好和最有效的方式來做到這一點。通知單線程:notify,notifyAll或concurrent.locks.Condition?

第一個解決方案是信號結合wait-notify(我知道如何正確實現這種模式,這不是問題)。

我在某處使用java.concurrent庫和CountDownLatch來讀取信號更有效。我也檢查了concurrent.locks.Condition,但this話題指出,它僅僅是一個(程序員方面)更安全和通用的結構,與notify/notifyAll相比沒有性能優勢。 Peter Lawrey建議使用併發庫,而不是notify-notifyAllthis評論,所以現在我很困惑什麼是最佳實踐使用。

一個相關的問題:哪個更好的性能,notifynotifyAll在我的情況(即如果我有一個線程)?我知道有很多類似的線索,但他們都沒有給出明確的答案。就我而言,在功能上,我使用哪個並不重要,但是我想知道哪個更快。

+0

我幾乎總是半信賴彼得勞瑞的建議。 – Eugene

+0

我只會這樣做,如果邏輯參數(親,反)是平衡的,或者如果問題是經驗性的,不能分析接近。 –

回答

3

海事組織他們沒有太大的區別「性能明智」,因爲他們都暫停調用相應的wait線程,所以最有可能的底層機制非常相似。無論如何,爲什麼表現會非常重要?除非你有一些極其快速的等待/信號模式,其中信號在等待後立即出現,使得上下文切換太昂貴,並且可能需要使用自旋鎖,因此無需擔心性能。

你應該實現你認爲最方便的編程方法,然後進行基準測試,看看你是否真的需要更高性能的東西。

+0

然後我會去通知/通知所有,但仍然有一個問題:爲了發信號通知一個線程,哪個更有效?這需要了解如何爲他們實現JVM。我知道差別是微不足道的,但寧願一個到另一個需要沒有加優化工作(因爲我要麼寫「通知」或「notifyall」),所以我想用「理論上」更好的解決方案(因爲沒有理由不這樣做)。 –

+0

@Thomas Calc:你期望在你的應用程序中使用這些機制的頻率如何? – Tudor

+0

這取決於用戶的輸入,一般。在最壞的情況下,每秒一次。 –

0

wait-notify非常好。

由於等待列表上只有一個線程,所以在notifynotifyAll之間沒有區別,語義或性能。

相關問題