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条件中直接使用该列作判断条件. ...
随机推荐
- 传统OGG与Microservice Architecture OGG的通信
针对当前新出的ogg microservice architect(MA),现在只支持oracle 11g/12c的数据复制和投递.如果有其它版本的oracle或其它数据库,比如 mysql, db2 ...
- ubuntu_python_environment
参考:http://blog.csdn.net/kingppy/article/details/13080919 参考:http://blog.csdn.net/zhaobig/article/det ...
- javaweb笔记—02
1.compatible:adj. 兼容的:能共处的:可并立的2.web所有的请求都是http请求,http请求默认的编码是ISO-8859-1,不支持utf-8,要统一设置前台和后台一样,才不会乱码 ...
- makefile 变量展开
Makefile中给变量赋值: = 是递归展开式变量 value1 = 5 value2 = $(value1) value1 = 6 最终$(value2)就变成了6 := 是直接展开 ...
- Maven工程打成一个jar包
1:maven-shade-plugin 插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <a ...
- windows下常用linux对应工具
tail 可从http://files.cnblogs.com/hantianwei/tail.zip下载,解压后exe,如下: e:\>tail -fn 300 tool-slow.logus ...
- VScode 好用插件集合(一)
VScode 好用插件集合(一) 什么是VScode Visual Studio Code (简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语 ...
- 一种基于 Numpy 的 TF-IDF 实现报告
一种基于 Numpy 的 TF-IDF 实现报告 摘要 本文使用了一种 state-of-the-art 的矩阵表示方法来计算每个词在每篇文章上的 TF-IDF 权重(特征).本文还将介绍基于 TF- ...
- JSON(JavaScript Object Notation, JS 对象标记)
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言 ...
- CentOS7下Docker中构建Jenkins容器
背景 在CentOS搭建Docker完成后,我们需要在Docker中搭建Jenkins用来实现工程自动部署. 安装前提 jdk已安装,安装目录如:usr/java/jdk1.8.0_161 maven ...