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

2022-09-01 15:28:47

请告诉用1和零初始化的信号量有什么区别。如下所示:

public static Semaphore semOne = new Semaphore(1);

public static Semaphore semZero = new Semaphore(0);

答案 1

Semaphore 实例的参数是可用的“允许”数。它可以是任何整数,而不仅仅是 0 或 1。

对于所有呼叫将阻止,并且呼叫将返回 false,直到您执行semZeroacquire()tryAcquire()release()

因为第一个调用将成功,其余调用将阻塞,直到第一个调用释放。semOneacquire()

该类在这里有很好的文档记录。

参数:许可证 - 可用的初始许可证数。此值可能为负数,在这种情况下,必须在授予任何获取之前进行释放。


答案 2

构造函数参数(初始信号量计数器)是在计数器(允许)为零和块之前可以进行的调用次数。permitsSemaphore.aquire()acquire()

1 是正常值,以确保只有一个线程通过获取。

semaphore.acquire();
try {
    // Critical region
    ...
} finally {
    semaphore.release();
}

有关 0 的用法请参阅此处

信号量是并发的低级机制:当达到零阻塞线程执行时,计数器。它源于Dijkstra,其中二进制信号量(0,1)是铁路信号量的隐喻,表示通过(当0时停止,通过--允许),并在受保护轨道的末尾进行释放(++允许)。


推荐