1 /*
  2  * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)
  3  * */
  4 public class TestProductorAndConsumerForLock {
  5     public static void main(String[] args) {
  6         WareHouse wareHouse = new WareHouse();
  7         Productor pd1 = new Productor(wareHouse);
  8         Consumer cs1 = new Consumer(wareHouse);
  9
 10         new Thread(pd1, "消费者1").start();
 11         new Thread(cs1, "生产者1").start();
 12         // 若有多个 生产者消费者,可能会产生虚假唤醒(缺货了,多个生产线程等待,唤醒时,这些生产线程同时醒来,对数据进行操作,这种问题叫做虚假唤醒)
 13         // 解决办法:wait方法 尽量 使用在循环中,被唤醒之后,再去判断是否符合条件(库存是否达到上限),不符合条件
 14         // 继续等待(等待消费者去消费商品),直到 条件符合(库存有空闲)
 15         new Thread(pd1, "消费者2").start();
 16         new Thread(cs1, "生产者2").start();
 17     }
 18 }
 19
 20 // 仓库
 21 class WareHouse {
 22     // 商品数量
 23     private int products = 0;
 24     private ReentrantLock lock = new ReentrantLock();
 25     //使用 Condition 的前提是 使用 Lock 同步锁,Condition 实例 实质上被绑定到一个锁上
 26     private Condition condition = lock.newCondition();
 27
 28     public void set() {
 29         lock.lock();
 30         try {
 31             while (products >= 1) {
 32                 System.out.println("商品库存满了");
 33                 try {
 34                     // 如果商品满了,阻塞线程,等待消费者线程消费完成后唤醒,
 35                     condition.await();  //相当于(Object.awatit() 但是功能更强大)
 36                 } catch (InterruptedException e) {
 37                     // TODO Auto-generated catch block
 38                     e.printStackTrace();
 39                 }
 40             }
 41             System.out.println("生产了商品,剩余库存" + ++products);
 42             condition.signalAll();     //相当于 (Object.notifyAll,功能更强大)
 43         } finally {
 44             lock.unlock();
 45         }
 46
 47     }
 48
 49     public void get() {
 50         lock.lock();
 51         try {
 52             while (products <= 0) {
 53                 System.out.println("商品库存没了");
 54                 try {
 55                     // 如果商品没了,阻塞线程,等待生产者线程生产完成后唤醒,
 56                     condition.await();
 57                 } catch (InterruptedException e) {
 58                     // TODO Auto-generated catch block
 59                     e.printStackTrace();
 60                 }
 61             }
 62             System.out.println("消费了商品,剩余库存" + --products);
 63             condition.signalAll();
 64         } finally {
 65             lock.unlock();
 66         }
 67
 68     }
 69 }
 70
 71 // 生产者
 72 class Productor implements Runnable {
 73     private WareHouse wareHouse;
 74
 75     public Productor(WareHouse wareHouse) {
 76         this.wareHouse = wareHouse;
 77     }
 78
 79     @Override
 80     public void run() {
 81         for (int i = 0; i < 20; i++) {
 82             try {
 83                 Thread.sleep(200);
 84             } catch (InterruptedException e) {
 85                 // TODO Auto-generated catch block
 86                 e.printStackTrace();
 87             }
 88             wareHouse.get();
 89         }
 90     }
 91
 92 }
 93
 94 // 消费者
 95 class Consumer implements Runnable {
 96     private WareHouse wareHouse;
 97
 98     public Consumer(WareHouse wareHouse) {
 99         this.wareHouse = wareHouse;
100     }
101
102     @Override
103     public void run() {
104         for (int i = 0; i < 20; i++) {
105
106             wareHouse.set();
107         }
108     }
109
110 }

转载于:https://www.cnblogs.com/xuzekun/p/7429123.html

7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)...相关推荐

  1. 生产者消费者模型之lock版本(JAVA)

    生产者消费者模型之lock版本 package com.company.run;import java.util.LinkedList; import java.util.concurrent.loc ...

  2. java同步锁实例_Java lock同步锁使用实例解析

    这篇文章主要介绍了Java lock同步锁使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1)Lock是一个接口,而synchroniz ...

  3. Java实现生产者消费者案例

    目录 一.生产者消费者模式概述 二.生产者消费者案例 三.代码 奶箱类(Box): 生产者类(Producer): 消费者类(Customer): 测试类(BoxDemo): 四.运行结果 一.生产者 ...

  4. 生产者-消费者模式的三种实现方式

    2.生产者-消费者模式的三种实现方式 1.背景                                                                    生产者生产数据到缓 ...

  5. 基于Lock的卖票和生产者消费者案例

    1.三个售票员卖出30张票 线程 操作(对外暴露的调用方法) 资源类 2.生产者消费者问题 题目:现在两个线程,可以操作初始值为零的一个变量,实现一个线程对该变量加1,一个线程对该变量减1,实现交替, ...

  6. 生产者消费者案例java代码

    大纲:java线程知识体系 一.概念 生产者消费者问题也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了共享固定大小缓冲区的两个线程--即所 ...

  7. 生产者-消费者 领导者-追随者 半同步-半异步

    转载自:http://blog.csdn.net/henuyx/article/details/39458215 都是概念问题,实现并不是什么难事,网上示例一搜一大堆. 一. 生产者-消费者模型 ht ...

  8. Lock同步锁--线程同步

    Lock-同步锁 Lock是java5提供的一个强大的线程同步机制--通过显示定义同步锁对象来实现同步.Lock可以显示的加锁.解锁.每次只能有一个线程对lock对象加锁. Lock有ReadLock ...

  9. 一个简单的生产者消费者案例

    生产者消费者模式 为什么要引入生产者消费者模式 简单来说就是为了解决多线程下程序先后执行问题 遇到的例:实际生产中出现的场景 服务D依赖于服务A.B.C产生的数据,服务D必须等待A.B.C产生结果并持 ...

最新文章

  1. 【MySQL】(图解)快速理解内连接、外连接、左连接、右连接
  2. php 报错乱码,thinkphp3 phpexcel 导出报错乱码清除ob
  3. 基于Apache Spark的机器学习及神经网络算法和应用
  4. ktt算法 约化_推荐系统的多目标优化(4)-PE-LTR
  5. Laravel项目上传github后,clone到本地运行时报错500的解决方法
  6. bootstrap -- 一个标签中,同时有 col-xs , col-sm , col-md , col-lg
  7. Android 图形架构
  8. Mac OS使用技巧之十三:Finder中标记的使用
  9. 牛客题霸 [栈和排序] C++题解/答案
  10. C++ new和malloc的区别
  11. 解决 ubuntu出现的 cd Do-bash: cannot create temp file for here-document: Permission denied问题
  12. linux安装tomcat后启动报错Cannot find ./catalina.sh的解决方法
  13. ng机器学习视频笔记(三) ——线性回归的多变量、特征缩放、标准方程法
  14. vue 鼠标点击事件_点击鼠标,利用VBA代码实现精准控制触发事件的第二方案
  15. jQuery动态星级评分效果实现方法
  16. linux svn服务器同步,Linux服务器实现SVN与WEB同步解决方案
  17. 网络PXE启动WinPE,支持UEFI和LEGACY引导
  18. Nature Neuroscience(一)
  19. 我的c盘为多余的java.exejavaw.exe_java.exe,javac.exe,javaw.exe 是什么进程?
  20. 简易个人所得税计算器

热门文章

  1. 什么是jquery_什么是jQuery?
  2. JavaScript基础-基本数据类型和基本流程控制
  3. matlab的findpeak 极点查找
  4. linux三剑客之awk必杀技一例   linux命令
  5. [鸟哥linux视频教程整理]03_03_bash特性详解续
  6. ps -ef|grep httpServer|grep -v grep|cut -c 9-15|xargs kill -9
  7. plist文件中iphone和ipad的应用图片设置
  8. ASP.NET MVC 3.0学习系列文章(开始学习MVC)
  9. 【字符串替换】程序员面试金典——1.4空格替换
  10. 剑指offer——面试题3:二维数组中的查找