用1和0初始化的信号量之间的差异

时间:2014-08-29 07:35:43

标签: java java.util.concurrent

请告诉我有什么区别信号量用1和0初始化。如下:

public static Semaphore semOne = new Semaphore(1);

public static Semaphore semZero = new Semaphore(0);

3 个答案:

答案 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个许可证,信号量的整个点就是等待许可证再次可用!