Java信号量默认使用忙等待还是等待/通知?

问题描述:

正如问题所在。我在Windows 7上使用JDK 6.0,并试图使用信号作为解决同步问题的机制。它完美地工作,但我试图避免忙于等待我的问题。Java信号量默认使用忙等待还是等待/通知?

我只想问Java文档和割舍这么麻烦,但该文档是这样的:

Acquires the given number of permits from this semaphore, 
blocking until all are available, or the thread is interrupted. 

Acquires the given number of permits, if they are available, 
and returns immediately, reducing the number of available permits 
by the given amount. 

If insufficient permits are available then the current thread 
becomes disabled for thread scheduling purposes and lies dormant 

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Semaphore.html#acquire(int

也就是说,该文档似乎在暗示两个答案。哪一个是正确的?

+0

大部分'java.util.concurrent'原语都依赖于基于park/unpark的'java.util.concurrent.locks.AbstractQueuedSynchronizer',即没有繁忙的旋转 – bestsss 2011-12-26 03:20:07

这显然等待/通知,由于这一行:

如果足够的可用许可,那么当前线程用于线程调度目的,禁用 和处于休眠状态。

这意味着线程不会被OS调度,直到唤醒它的事件(可用信号许可)才会发生,此时线程将被发送信号以继续执行。

+0

它是公园/非公园,不等待/通知,因为等待/通知需要同步(或争用),公园/非公园 - 之间存在差异。 – bestsss 2011-12-26 03:21:45

我不明白它是如何暗示忙等待。它清楚地表明该线程被“禁用”并处于休眠状态。基本上,它很便宜:线程在等待获取信号量时不会消耗处理器时间。

+0

但是上面的那一行说,在等待时线程阻塞,这似乎是矛盾的。 – Faqa 2011-12-25 18:36:20

+1

是的。阻塞忙等待。如果一个线程在信号量中没有足够的'许可'调用'等待',那么这个调用不会返回,直到另一个线程发出足够的许可来满足等待线程。正如Jon Skeet所写的那样 - 在等待期间线程被阻塞,并且根本没有CPU。试试看看 - 在空信号量上阻塞循环线程并检查CPU使用情况 - 它将为零。 – 2011-12-25 19:00:07

+0

@Faqa:正如马丁所说,阻塞和忙等待不一样。 – 2011-12-25 20:34:44