2014-08-29 512 views
3

请告诉信号量使用1和零初始化的区别是什么。如下:信号量与1和0初始化的区别

public static Semaphore semOne = new Semaphore(1); 

public static Semaphore semZero = new Semaphore(0); 
+0

它指定*许可*。勾选[here](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html) – TheLostMind 2014-08-29 07:37:28

+0

@TheLostMind javadocs提到一个否定许可,但不是零 – 2014-08-29 07:38:43

+1

它的行为与在许可证是否定的情况下。在调用acquire()之前,我们需要在信号量上调用release()。 – 2014-08-29 07:46:01

回答

5

到信号量实例的参数是可用“许可证”的数量。它可以是任意整数,不只是0或1

对于semZero所有acquire()调用将被阻塞和tryAcquire()调用将返回false,直到你做一个release()

semOne第一acquire()调用会成功,其余将阻塞,直到第一个发布。

该课程有详细记录here

参数:许可证 - 可用许可证的初始数量。这个 的值可能是负值,在这种情况下,必须在授予任何 获取权之前发布。

+0

一旦semzero被释放,有多少线程可以获取?是1吗?基本上什么是sem0ero允许的许可证 – developer 2018-02-11 04:31:35

3

构造参数permits(初始信号量计数器)是调用Semaphore.aquire()能够之前所述计数器(许可证)制成是零,并且acquire()块的数量。

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

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

对于的使用见here

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

+0

semzero发布后有多少线程可以获取?是1吗?基本上什么是允许semzero – developer 2018-02-11 04:32:23

+0

@developer允许考虑'... acquire(); [Critical Section] release(); ...'将允许另一个'acquire()'(在第一次获取后调用)通过。在计算机科学中,荷兰Dijkstra使用了火车类比:信号量,P = passeren = try-pass/acquire,V = vrij maken = release。 – 2018-02-11 21:08:24