synchronized中判断条件用while而不是if
假设一个生产者生产一个产品,两个消费者A,B去取这个商品。
使用if:
A去取商品,发现空,于是等待...
B去取商品,发现空,于是等待...
生产者生产商品,唤醒他们
B先争到锁,从wait()后执行代码,跳出if,取走商品。
A后争到锁,从wait()处出发,跳出if,发现竟然没东西,取东西失败,越界。
结果
改用while
A去取商品,发现空,于是等待...
B去取商品,发现空,于是等待...
生产者生产商品,唤醒他们
B先争到锁,从wait()后执行代码,再次执行while,发现不必进入while,于是取走商品。
A后争到锁,从wait()处出发,再次执行while,符合循环条件,等待。
结果
代码生产者
package whileinsyn; import java.util.List; public class addsir implements Runnable{
private List<String> list;
public addsir(List<String> list) {
this.list=list;
} @Override
public void run() {
// TODO Auto-generated method stub
synchronized(list) {
System.out.println("生产者生产食品中...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
list.add("食品哈哈哈");
System.out.println("已生产完毕食品哈哈哈.*&*.");
list.notifyAll();
} System.out.println("生产者今日生产量已完成...");
} }
代码消费者
package whileinsyn; import java.util.List; public class deletesir implements Runnable{
private List<String> list;
public deletesir(List<String> list) {
this.list=list;
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized(list) {
while(list.size()==0) {
System.out.println("仓库无货,请消费者"+Thread.currentThread().getName()+"稍后再来...");
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("消费者"+Thread.currentThread().getName()+"正在取走货物...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("消费者"+Thread.currentThread().getName()+"已取走"+list.remove(0));
//list.notifyAll();
}
} }
主类
package whileinsyn; import java.util.*; public class Main {
public static void main(String[] args) throws InterruptedException {
List<String> list=new ArrayList<>();
Thread provider=new Thread(new addsir(list));
Thread consumer01=new Thread(new deletesir(list),"一号");
Thread consumer02=new Thread(new deletesir(list),"二号"); consumer01.start();
consumer02.start();
Thread.sleep(3000);
provider.start(); }
}
synchronized中判断条件用while而不是if的更多相关文章
- mybatis 传参为 Integer 时 ,Mapper 文件 中判断 条件 问题。
<if test="valiStatus==null || valiStatus=='' || valiStatus==4 "> b.work_permit_card_ ...
- Java判断语句中判断条件的执行顺序
if判断里面如果是多个条件的判断,会按照从前往后的顺序执行.基本所有语言都是一致的设计,这样做能提高程序的效率. 比如: if ( conditionA && conditionB ) ...
- mysql中判断条件
if / case when 判断 SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "m ...
- wait()方法写在while循环中可以在线程接到通知后再一次判断条件
wait()方法写在while循环中可以在线程接到通知后再一次判断条件 synchronized public String pop() { String returnValue = "&q ...
- if语句中的判断条件(nginx)
if语句中的判断条件 正则表达式匹配: ==:等值比较; ~:与指定正则表达式模式匹配时返回"真",判断匹配与否时区分字符大小写: ~*:与指定正则表达 ...
- ThinkPHP3.2中if判断条件是两个变量
<select name="typeId"> <foreach name="typeInfo" item="v"> ...
- SQL语句Where中使用别名作为判断条件
当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件. 例如下面的SQL语句: select id, (c1 + c2) as s from t1 where ...
- sql 语句中使用条件判断case then else end
sql 语句中使用条件判断case then else end范例: SELECT les.[nLessonNo] FROM BS_Lesson AS les WHERE les.[sClassCod ...
- 转载:SQL语句Where中使用别名作为判断条件
原文地址:http://www.cnblogs.com/dwfbenben/p/3307941.html 当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件. ...
随机推荐
- Kattis之旅——Divisible Subsequences
Given a sequence of positive integers, count all contiguous subsequences (sometimes called substring ...
- Google's Machine Learning Crash Course #04# First Steps with TensorFlow
1.使用 TensorFlow 的建议 Which API(s) should you use? You should use the highest level of abstraction tha ...
- php stomp.dll 下载地址
http://pecl.php.net/package/stomp/1.0.9/windows 查看方法,打开phpinfo
- tomcat日志警告WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'debug' to '0' did not find a matching property.
日志中有警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'debug' to '0' did ...
- windows下常用linux对应工具
tail 可从http://files.cnblogs.com/hantianwei/tail.zip下载,解压后exe,如下: e:\>tail -fn 300 tool-slow.logus ...
- 06: mysql索引查找原理及调优
MySQL其他篇 目录: 1.1 常见查找方法举例 1.2 索引数据结构设相关的计算机原理 1.3 MyISAM实现索引 1.4 InnoDB索引实现 1.5 索引使用策略 1.1 常见查找方法举例返 ...
- update与select关联执行效率问题
UPDATE fl_user_space u SET u.`course_count` = (SELECT COUNT(*) FROM fl_course c WHERE c.uid = u.uid) ...
- tp剩余未验证内容-2
如何设置一个 "资源" (文件/图片/zip/视频等)在点击时, 自动开始下载? 通常只要在这些地方, 设置 一个链接a, 让href等于这个资源就行了. 这样当点击这个资源时, ...
- SP10707 COT2 - Count on a tree II 莫队
链接 https://vjudge.net/problem/SPOJ-COT2 https://www.luogu.org/problemnew/show/SP10707 思路 dfs欧拉序转化为普通 ...
- Newcoder 华华给月月出题(线筛)题解
题目描述: 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: Ans=⊕Ni=1(iNmod(109+7))Ans=⊕i=1N(iNmod(109+7)) ⊕⊕符 ...