回答
有差异:
- 信号灯可以由一个线程来获取和另一个线程释放。这样,一个线程可以发信号通知另一个线程。计数为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