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条件中直接使用该列作判断条件. ...
随机推荐
- 关于Android Camera2 API 的自动对焦的坑
https://www.jianshu.com/p/280e5301b7b9 一.使用.关于Camera2的API使用,参考Google官方的例子: Camera2Basic Camera2Raw C ...
- ==和equasl、hashmap原理(***)
public class String01 { public static void main(String[] args) { String a="test"; String b ...
- yii2项目中运行composer 过程中遇到的问题
问题1: Your requirements could not be resolved to an installable set of packages 则表明 未安装fxp/composer-a ...
- php实现共享内存进程通信函数之_shm
前面介绍了php实现共享内存的一个函数shmop,也应用到了项目中,不过shmop有局限性,那就是只支持字符串类型的:sem经过我的测试,是混合型,支持数组类型,可以直接存储,直接获取,少了多余的步骤 ...
- django F表达式、Q表达式、annotate、order_by
如下模型: class Book(models.Model): name = models.CharField(max_length=100) pages = models.IntegerField( ...
- JS传值中文乱码解决方案
JS传值中文乱码解决方案 一.相关知识 1,Java相关类: (1)java.net.URLDecoder类 HTML格式解码的实用工具类,有一个静态方法:public static String ...
- 纯手写SpringMVC到SpringBoot框架项目实战
引言 Spring Boot其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 通过这种方式,springboot ...
- Thinkphp5 分页带参数
原文链接:http://www.zhaisui.com/article/51.html
- maven的使用记录
maven的使用记录 使用的版本为3.6.0. maven配置部署项目 在cmd命令行中切换到Maven项目的根目录,比如:D:/xxxwork/java/maven-test,然后执行命令:$ mv ...
- 福州大学第十五届程序设计竞赛_重现赛B题迷宫寻宝
Problem B 迷宫寻宝 Accept: 52 Submit: 183Time Limit: 1000 mSec Memory Limit : 32768 KB Problem De ...