美文网首页
2019-07-14 多线程中的Lost wake-up pro

2019-07-14 多线程中的Lost wake-up pro

作者: hexm01 | 来源:发表于2019-07-14 21:20 被阅读0次

    这个问题并不是说只在Java语言中会出现,而是会在所有的多线程环境下出现。

    假如我们有两个线程,一个消费者线程,一个生产者线程。生产者线程的任务可以简化成将count加一,而后唤醒消费者;消费者则是将count减一,而后在减到0的时候陷入睡眠:
    生产者伪代码:

    count+1;
    notify();
    消费者伪代码:

    while(count<=0)
    wait()
    count--
    熟悉多线程的朋友一眼就能够看出来,这里面有问题。什么问题呢?
    生产者是两个步骤:

    count+1;
    notify();

    消费者也是两个步骤:

    检查count值;
    睡眠或者减一;

    万一这些步骤混杂在一起呢?比如说,初始的时候count等于0,这个时候消费者检查count的值,发现count小于等于0的条件成立;就在这个时候,发生了上下文切换,生产者进来了,噼噼啪啪一顿操作,把两个步骤都执行完了,也就是发出了通知,准备唤醒一个线程。这个时候消费者刚决定睡觉,还没睡呢,所以这个通知就会被丢掉。紧接着,消费者就睡过去了……


    image.png

    这就是所谓的lost wake up问题。

    解决办法
    Java强制我们的wait()/notify()调用必须要在一个同步块中,就是不想让我们在不经意间出现这种lost wake up问题。否则会抛出IllegalMonitorStateException。
    不仅仅是这两个方法,包括java.util.concurrent.locks.Condition的await()/signal()也必须要在同步块中:

    参考链接:https://www.jianshu.com/p/b8073a6ce1c0

    相关文章

      网友评论

          本文标题:2019-07-14 多线程中的Lost wake-up pro

          本文链接:https://www.haomeiwen.com/subject/iugikctx.html