java中多线程中测试某个条件的变化用 if 还是用 while?
2017-05-09 15:48
691 查看
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和notify函数的规范代码模板:
// The standard idiom for calling the wait method in Java synchronized (sharedObject) { while (condition) { sharedObject.wait(); // (Releases lock, and reacquires on wakeup) } // do action based upon condition e.g. take or put into queue }
相关文章推荐
- java中多线程中测试某个条件的变化用 if 还是用 while?
- java题目:求 1+2+...+n,要求不能用除法、 for、 while、 if、 else、 switch、 case 等关键字及条件判断语句( A?B:C)。
- java中if判断条件语句测试代码总结
- java生产者消费者PV操作为中,wait判断条件为何是while不是if疑惑解答
- 多线程为何用while判断条件,而不用if。
- 多线程wait 和 notify的判断条件(if 和 while)和假死
- java多线程为什么要用while而不是if
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。Java实现
- 剑指Offer(Java版): 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- 比较Jmeter、Grinder和JAVA多线程本身压力测试所带来的性能开销
- JAVA 集合多线程下的使用及测试
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- 关于java中是地址传递还是值传递的测试
- java中模拟#if条件编译
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- Shell 学习(四、条件测试(test,[]) 和 条件判断(if..then..fi))
- Java 多线程 生产者与消费者问题测试代码
- 求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字以及条件判断语句
- PHP 不用求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
- 【练习】题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句