多线程情况下建议使用while而不是if
来源:互联网 发布:sql replace 正则 编辑:程序博客网 时间:2024/05/02 04:47
在看java核心技术讲到多线程中用条件对象,说到通常对await的调用应该在
在代码中实验了下,在调用await()之前打印一下"thread will wait",发现用while时会打印大量的"thread will wait",而if时会少很多。这样是不是表示while和if的机制会不一样。想知道这是为什么推荐用while,它和if有啥区别
因为可能有多个线程await在这里,一个notifyAll,全部唤醒,又要重新竞争,先得到时间片的线程向下运行了,其他线程又需要回到await上。如果不是while,而是if,所有的线程都会走下去了
while(!(ok to proceed)){condition.await();}
在代码中实验了下,在调用await()之前打印一下"thread will wait",发现用while时会打印大量的"thread will wait",而if时会少很多。这样是不是表示while和if的机制会不一样。想知道这是为什么推荐用while,它和if有啥区别
因为可能有多个线程await在这里,一个notifyAll,全部唤醒,又要重新竞争,先得到时间片的线程向下运行了,其他线程又需要回到await上。如果不是while,而是if,所有的线程都会走下去了
举个例子,一个生产者消费者模型的任务队列,一个生产者一次可能放入多个任务,然后用notifyAll通知消费者,但是并非所有被唤醒的消费者都能取到一个任务,那么队列被读空了之后的消费者肯定得继续await。如果你用if来判断,这个消费者第二次被notify的时候就不会再次判断!(ok to proceed)这个条件了,如果这个时候这个消费者又一次没抢到任务,但是代码还是往下执行了,轻则空指针异常,重了干出什么事情来都说不定了。
所以必须用while来检查!(ok to proceed),这样可以保证每次被唤醒都会检查一次条件。
1 0
- 多线程情况下建议使用while而不是if
- 生产者消费者模式中条件判断是使用while而不是if
- 什么情况下使用多线程
- 什么情况下使用多线程?
- 什么情况下使用多线程
- 什么情况下使用多线程
- synchronized在多线程情况下的使用
- 建议17:多数情况下使用foreach进行循环遍历
- 什么情况下用Hashtable而不是HashMap
- python下if/for/while用法
- dedecms下dede:sql及默认情况下使用if判断的方法
- js 多if情况下在优化。
- 在特殊情况下用memmov,而不是memcopy
- switch注意事项与在什么情况下使用switch或if语句
- scala中循环不建议使用while和do...while,而建议使用递归
- 多线程情况下慎用localtime_r
- HashMap多线程不建议使用
- 为什么使用if(0 == a)而不是if(a == 0)
- 关于PCA算法的一点学习总结
- php生成订单号的解决方案
- Java源码解读:顶级父类Object
- 常用排序算法稳定性分析
- Java的内存机制
- 多线程情况下建议使用while而不是if
- Sublime - php 代码格式化插件
- An overview of memory management in QEMU
- iOS archive(归档)的总结
- android使用ImageLoader显示圆角图片
- 特征向量物理意义
- 菜鸟学Android笔记(四十一):JSP指令元素——page指令
- extjs-->form
- Mac之终端常用操作指令(一)