java semaphore 等待时间_java semaphore 实现等待队列问题为什么死锁

两个生产者,每个都生产三十次。两个消费者,每个都消费三十次。篮子初始化四个苹果,总容量十个。full为semaphone(4)empty为semaphore(6)mutex为全局锁semaphore(1)消费者:full.Wai...

两个生产者,每个都生产三十次。

两个消费者,每个都消费三十次。

篮子初始化四个苹果,总容量十个。

full 为 semaphone(4)

empty 为 semaphore(6)

mutex 为全局锁 semaphore(1)

消费者:

full.Wait();

mutex.Wait();

消费....

mutex.Signal();

empty.Signal();

生产者:

empty.Wait();

mutex.Wait();

生产....

mutex.Signal();

full.Signal

Semaphore 同步的 Wait() {

this.value--;

if(value<0) wait; // 省略 try catch

}.

常规的 Semaphore 使用 while(value < 0) 控制 wait(). 但是上述的 Semaphore 使用 while() 就死锁,使用 if 没有任何问题。

我的问题:

问题1:

两个消费者都 wait() 等待生产者时,生产者生产完 mutex.Signal() 中有 notify(), full.Signal() 中又有 notify(), 这里唤醒了大家几次?

问题2:

两个消费者都 wait() 等待生产者时,生产者生产完一个通知大家,如果等待的消费者1抢到机会开始消费,之后释放mutex锁时 notify() 通知大家,如果等待的消费者2抢到机会消费,但是却是没有可以消费的... 这里是怎么造成的那?

谢谢

因为标准的 Semaphore 不允许负值,使用 while(value<=0) 进行 wait(), 然后才能 value--.

但是如果允许负值,则可以实现等待队列。这个问题就是要实现队列。如果使用 value--; while(value<0) wait() 就会死锁,但是需要修改为 if 才没有死锁。这是为什么那?

展开

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值