java 变量 互斥,何时需要一个条件变量,是不是一个互斥量足够?

即使您可以按照描述的方式使用它们,但互斥锁并非设计用作通知/同步机制 . 它们旨在提供对共享资源的互斥访问 . 使用互斥锁来发出信号是很尴尬的,我想这看起来像这样(Thread2由Thread2发出信号):

线程1:

while(1) {

lock(mutex); // Blocks waiting for notification from Thread2

... // do work after notification is received

unlock(mutex); // Tells Thread2 we are done

}

线程2:

while(1) {

... // do the work that precedes notification

unlock(mutex); // unblocks Thread1

lock(mutex); // lock the mutex so Thread1 will block again

}

这有几个问题:

在Thread1完成"work after notification"之前,Thread2无法继续"do the work that precedes notification" . 使用这种设计,Thread2甚至不是必需的,也就是说,为什么不将"work that precedes"和"work after notification"移动到同一个线程中,因为只有一个可以在给定时间运行!

如果Thread2无法抢占Thread1,则Thread1会在重复while(1)循环时立即重新锁定互斥锁,并且即使没有通知,Thread1也会执行"work after notification" . 这意味着你必须以某种方式保证Thread2会在Thread1之前锁定互斥锁 . 你是怎样做的?可能通过睡眠或某些其他特定于操作系统的方式强制执行调度事件,但即使这不能保证根据时间,操作系统和调度算法工作 .

这两个问题并不轻微,事实上,它们都是主要的设计缺陷和潜在的错误 . 这两个问题的根源是要求在同一个线程中锁定和解锁互斥锁 . 那么你如何避免上述问题呢?使用条件变量!

顺便说一句,如果您的同步需求非常简单,您可以使用一个简单的旧信号量,避免条件变量的额外复杂性 .

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值