美文网首页
为什么wait()一定要放在循环中

为什么wait()一定要放在循环中

作者: lxqfirst | 来源:发表于2018-04-30 20:27 被阅读0次
参考:https://blog.csdn.net/yiifaa/article/details/76341707

在多线程的编程实践中,wait()的使用方法如下:

synchronized (monitor) {
    //  判断条件谓词是否得到满足
    while(!locked) {
        //  等待唤醒
        monitor.wait();
    }
    //  处理其他的业务逻辑
}

那为什么非要while判断,而不采用if判断呢?如下:

synchronized (monitor) {
    //  判断条件谓词是否得到满足
    if(!locked) {
        //  等待唤醒
        monitor.wait();
    }
    //  处理其他的业务逻辑
}

这是因为,如果采用if判断,当线程从wait中唤醒时,那么将直接执行处理其他业务逻辑的代码,但这时候可能出现另外一种可能,条件谓词已经不满足处理业务逻辑的条件了,从而出现错误的结果,于是有必要进行再一次判断,如下:

synchronized (monitor) {
    //  判断条件谓词是否得到满足
    if(!locked) {
        //  等待唤醒
        monitor.wait();
        if(locked) {
            //  处理其他的业务逻辑
        } else {
            //  跳转到monitor.wait(); 
        }
    }
}

而循环则是对上述写法的简化,唤醒后再次进入while条件判断,避免条件谓词发生改变而继续处理业务逻辑的错误。
这个在JDK代码中也多有应用,如ArrayBlockingQueue

    public E take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            while (count == 0)
                notEmpty.await();//这个condition的也是放在循环中的
            return extract();
        } finally {
            lock.unlock();
        }
    }

相关文章

  • 为什么wait()一定要放在循环中

    在多线程的编程实践中,wait()的使用方法如下: 那为什么非要while判断,而不采用if判断呢?如下: 这是因...

  • 为什么wait()一定要放在循环中

    在多线程的编程实践中,wait()的使用方法如下: 那为什么非要while判断,而不采用if判断呢?如下: 这是因...

  • 关于 Flutter for循环中使用await无效的问题

    之前也碰到过,在Flutter中for循环中用wait并不生效,外层并不会等待所有for循环中wait事件,貌似找...

  • 终于搞懂了sleep/wait/notify/notifyAll

    sleep/wait/notify/notifyAll分别有什么作用?它们的区别是什么?wait时为什么要放在循环...

  • 实习5.0

    wait 为什么一定要跟着synchronized???wait()的作用是让“当前线程”等待,而“当前线程”是指...

  • 第二章⑥跳转语句

    break 使用在switch中或者循环中使用在循环中,表示:结束当前循环(默认最近) continue 使用在循...

  • javaScript Break语句和Continue语句

    break语句用于跳出循环。 continue用于跳过循环中的一个迭代。 Break语句 break语句用于跳出循...

  • java中while的注意事项

    1.java循环中有while,do…while,以及for,但是没有while…do,切记切记 2.while循...

  • 20190218-Wait wait wait

    一、语音 1. Wait :t 是做口型,不发出声即可,并不是省音 2. wait for 放在句子末尾,不弱读 ...

  • why java

    为什么wait()和notify()方法是在Object类中,不在Thread类中wait()和notify() ...

网友评论

      本文标题:为什么wait()一定要放在循环中

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