zoukankan      html  css  js  c++  java
  • java中多线程中测试某个条件的变化用 if 还是用 while?

       wait和notify方法,有个地方要注意,就是经典的生产者和消费模式,使用wait和notify实现,判断条件为什么要用while而不能使用if呢?其实是因为当线程wait之后,又被唤醒的时候,是从wait后面开始执行,而不是又从头开始执行的,所以如果用if的话,被唤醒之后就不会在判断if中的条件,而是继续往下执行了,如果list只是添加了一个数据,而存在两个消费者被唤醒的话,就会出现溢出的问题了,因为不会在判断size是否==0就直接执行remove了。但是如果使用while的话,从wait下面继续执行,还会返回执行while的条件判断,size>0了才会执行remove操作,所以这个必须使用while,而不能使用if来作为判断。

    基于以上认知,下面这个是使用wait和notify函数的规范代码模板:

      永远都要把wait()放到循环语句里面。

       public void produce() {
            synchronized (this) {
                while (mBuf.isFull()) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                mBuf.add();
                notifyAll();
            }
        }
    
        public void consume() {
            synchronized (this) {
                while (mBuf.isEmpty()) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                mBuf.remove();
                notifyAll();
            }
    
        }
  • 相关阅读:
    第一个Java程序
    kibana 创建index pattern 索引模式时过慢导致无法创建成功 以及解决方案
    各种推导式
    生成器表达式
    生成器函数进阶
    迭代器和生成器
    pyhton 监听文件输入实例
    window 日志清除
    window iis重启
    TCP/IP四层模型
  • 原文地址:https://www.cnblogs.com/moxiaotao/p/9850346.html
Copyright © 2011-2022 走看看