请告诉我有什么区别信号量用1和0初始化。如下:
public static Semaphore semOne = new Semaphore(1);
和
public static Semaphore semZero = new Semaphore(0);
答案 0 :(得分:9)
信号量实例的参数是"许可"可用的。它可以是任何整数,而不仅仅是0或1.
对于semZero
,所有acquire()
个来电都会被阻止,tryAcquire()
来电将返回false,直到您执行release()
对于semOne
,第一个acquire()
调用将成功,其余调用将阻塞,直到第一个调用释放。
该课程有详细记录here。
参数:permit - 可用的初始许可数。这个 值可能是负数,在这种情况下,发布必须在任何之前发生 获得将被授予。
答案 1 :(得分:4)
构造函数参数permits
(初始信号量计数器)是在计数器(许可)为零之前可以进行的Semaphore.aquire()
调用次数,以及acquire()
块。
1 是一个正常值,以确保只有一个线程通过了获取。
semaphore.acquire();
try {
// Critical region
...
} finally {
semaphore.release();
}
要使用 0 ,请参阅here。
信号量是一种并发的低级机制:达到零阻塞线程执行时的计数器。它源于Dijkstra,其中二进制信号量(0,1)是铁路信号量的一个metaphore,表示传递(停止时为0,传递 - 允许),并且在受保护的轨道末尾执行释放(++)证)。
答案 2 :(得分:0)
当我第一次阅读信号量的文档时,我也误解了解释。我错过的主要观点是......最初的许可证数量......'。不知怎的,我虽然这将是许可证的数量,可以作为最大值,但事实并非如此。最后信号量只是从任何数字开始计数,但只有在信号量允许的时间超过1时才启动启用等待线程(使用获取)。
一段简单的(非线程)代码也显示了这一点:
@Test
public void testNegativeSemaphore()
{
Semaphore semaphore = new Semaphore(-2);
assertEquals(-2, semaphore.availablePermits());
semaphore.release();
assertEquals(-1, semaphore.availablePermits());
semaphore.release();
assertEquals(0, semaphore.availablePermits());
semaphore.release();
assertEquals(1, semaphore.availablePermits());
}
如代码所示,每次发布时可用许可都会增加,只允许其他线程在值达到1或更高时获得许可。
请注意,从那里可以通过使用aqcuire使availablePermits变为负数,因为如果有0个许可证,信号量的整个点就是等待许可证再次可用!