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条件中直接使用该列作判断条件. ...
随机推荐
- vue style 的scoped 使用
1 原理 vue 可以通过在 style标签添加scoped这个属性来控制 组件内的css作用域 <style scoped> @media (min-width: 250px) { .l ...
- Server Library [Apache Tomcat 7.0] unbound解决方案
问题描述: 当在MyEclipse中导入高版本Eclipse的[Eclipse Dynamic Web]项目后,会发现其Java Build Path(选定项目->Alt+Enter即可打开Pr ...
- Centos下搭建golang环境
一.下载安装包 先查看一下我的Centos版本,这里是6.4. # cat /etc/redhat-release CentOS release 6.4 (Final) 去go语言中文社区下载想要下载 ...
- word2010自定义的多级列表编号变成黑块的解决办法
首先,看图说话 是的,当我保存Word再打开之后,我辛辛苦苦(没错,小白有罪,调来调去真辛苦)搞得多级列表编号变成了黑块,默默无言,只有泪千行,还好有万能的Google. 解决办法: 将光标移到黑块的 ...
- jquery .width和css("width", )区别
1.$.fn.width会根据是否是borderBox来计算新的宽度,如果是borderBox,会额外加上padding和border的宽度,计算时只是按照px来,用rem做单位会出错: 2.$.fn ...
- 电影编码JPEG2000与H.264
电影的第三次革命是数字电影的诞生,数字电影取代了胶片,那么数字电影就一定有其独特的封装(压缩)格式.在网络上,我们经常见到许多视频格式,诸如mp4.mkv.flv.rmvb等,这些都是在通用计算机上播 ...
- dubbo-集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试. 各节点的关系: 这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker ...
- Summarization of Tech Interviews
Summarization of Tech Interviews(技术面试总结) 手心网(2015) Q1. 解释一下 TCP/IP 协议之滑动窗口? 滑动窗口协议的维基:https://en.wik ...
- Navicat Premium 12.0.18安装与激活(转)
转载:https://www.jianshu.com/p/42a33b0dda9c 一.Navicat Premium 12下载 Navicat Premium 12是一套数据库开发管理工具,支持连接 ...
- Web Service平台有三种元素构成:SOAP、WSDL、UDDI。区别和联系
Web Service平台有三种元素构成:SOAP.WSDL.UDDI.一个消费者可以在UDDI注册表查找服务,取得服务的WSDL描述,然后通过SOAP来调用服务.SOAP.WSDL.UDDI的区别如 ...