java - P & V 操作如何工作并设置信号量值?

标签 java semaphore

我对信号量中的 P 和 V 操作如何工作感到困惑(特别是在 Java 中,如果存在差异)。

据我所知,操作P会减少信号量的值,如果新值<0则进程被阻塞,而操作V则相反。但是,操作 P 可以将信号量值递减为负值吗?如果是这样,是否意味着操作 V 必须将信号量增加到正值才能给予进程许可?

假设我们有 4 个进程(或线程),分别称为 A、B、C 和 D。并且信号量 S 设置为 2。这些进程在创建时分别被调用(A、B、C 然后是 D)。意味着 A 将先行,然后 B 第二...等等

Semaphore S=new Semaphore(2);
S.acquire();
print(Thread.currentThread().getName() +" is in with S value=" + S.value);
S.release();
print(Thread.name +" is out S value=" + S.value);

根据我对它们如何工作的理解,我说输出将是这样的:

A is in with S=1

B is in with S=0

C tries to go in with S=-1 (Is this correct?)

B tries to go in with S=-2 (Is this correct?)

A is out with S=-1

C is in with S=-1

B is out with S=0

D is in with S=0

C is out with S=1

D is out with S=2

P.S:S.value并不真正存在,我只是把它放在那里来显示我想要看到/显示的内容。

最佳答案

从 N 个数字中递减该值的想法是使最多 N 个调用不被阻塞。

当该值达到0时,下一次调用将阻塞,并且该值不会递减,仍为0。

释放后,该值将增加到 1,并且等待进程将收到信号以尝试获取释放的锁。只有一个人能够做到这一点,其余的人将被阻止。

当所有进程释放信号量时,该值将恢复为N。

关于java - P & V 操作如何工作并设置信号量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46874876/

相关文章:

java - 如何洗牌存储在数组中的一副牌?

java - 是否可以使用 spring-security 来保护包含的 jsp?

java - Volley 未在最新版本的 Android 上发出请求

terminology - 什么是计数信号量?

c - 如何阻塞信号量直到其值为正数

c - 使用 POSIX 计数信号量作为二进制信号量

java - 如何在 Jface TableViewer 中选择单个单元格?

java - 比较两个字符串文字

c - 解锁然后立即锁定互斥锁/信号量。不好的做法还是有办法做到这一点?

c - 生产者消费者信号量值不正确