回答
有差異:
- 信號燈可以由一個線程來獲取和另一個線程釋放。這樣,一個線程可以發信號通知另一個線程。計數爲1的信號也可用於互斥。另一方面,鎖只用於相互排斥。
- 信號量不可重入。這意味着當許可證耗盡時,即使線程已被同一線程獲取,線程也無法獲取信號量。鎖可以是可重入的。
Semaphore
s很適合計數許可/發佈,所以如果你有多個資源,Lock
等。對你無能爲力。但是如果你只有一種資源需要防範,那麼它們已經足夠好了。
@Raif H絕對零差呢?只有我能想到的是,如果你不是100%確定它總是限制爲1。 – 2013-03-28 10:18:08
就像assylias所說的那樣,它們(和'java.util.concurrent'中的許多其他)基於'AbstractQueuedSynchronizer',並將具有相同的性能特徵。爲你選擇正確的語義。 – 2013-03-28 10:28:46
計數信號量示例:您有一個受保護的對象,並允許同時訪問不超過五個線程的限制。在這種情況下,初始值爲5的計數信號量就是數學擬合。 Downey's Little book of Semaphores是理解構造的最佳讀物之一。
雖然屬實,但我不明白這是如何回答這個問題的。 – NPE 2013-03-28 10:24:05
雖然這是事實,這可能與兩個完成,並且Semaphore
你首先必須弄清楚你將如何使用這些資源。如果您使用這意味着你將不得不在同步觀看主題:
public void run() {
// some code
synchronized (resource) {
// use resource
}
}
如果你不想讓線程觀看的(這在我看來是更好),在getter方法使用Semaphore
資源:
public Resource acquireResource() {
// acquire semaphore
return resource;
}
public void releaseResource() {
// release semaphore
}
和線程只是做:
public void run() {
// some code
Resource resource = ResourceContainer.getResource();
// do something with resource
releaseResource();
}
您可以Object
參數添加到這些方法只是比較如果同一個對象釋放信號量。
- 1. 多進程同步 - 比信號量更好的選擇?
- 2. 最好的選擇
- 3. 重寫__del __()是最好的選擇嗎?
- 4. 什麼是最好的選擇。在ASP.NET
- 5. WebStorage是我最好的選擇嗎?
- 6. 反射是我最好的選擇嗎?
- 7. 哪一個是最好的選擇?
- 8. 顯示大量富文本:選擇最好的選擇
- 9. PHP最好的CAPTCHA選擇
- 10. 選擇最好的優化
- 11. 什麼是最好的1-1聊天模式? (AJAX/CI/JQ)
- 12. C中設置的信號量的最大信號量數
- 13. SQL選擇性能最高的1 VS選擇1
- 14. 如何最好地確定信號的音量?
- 15. 什麼是Flash的最新和最好的選擇?
- 16. 如何在大規模的1-100規模數量
- 17. 互斥量和信號量之差= 1?
- 18. Java信號量最大?
- 19. Android - 如何掃描接入點並選擇最強的信號?
- 20. 從ObServer發出的選擇性D-BUS信號(單播信號)
- 21. 這是最好的ForeignKey還是選擇?有什麼不同?
- 22. 的確選擇了這些:django + smartGWT似乎是最好的選擇?
- 23. 戰略模式是從不同來源獲取相同信息的好選擇?
- 24. 的Javascript(最好是jQuery的),將模擬井號標籤
- 25. 最佳的信號強度和質量
- 26. QTreeWidget擴展選擇改變的信號
- 27. QTableWidget中整行選擇的信號
- 28. 「從選擇ABC(選擇1)爲abc」 生產 「(1)」 而不是 「1」
- 29. 在productID = 1的情況下選擇最低數量
- 30. 什麼是大規模動態選擇和查詢的最佳實踐
爲什麼不'synchronized'? – NPE 2013-03-28 10:16:11
我不認爲會有任何 - 當'permit'設置爲1時,2個API變得幾乎相同。並且這兩個實現都基於'AbstractQueuedSynchronizer',所以行爲和性能應該接近相同。 – assylias 2013-03-28 10:16:13