当仓库满了时才允许消费者消费,当仓库为空时,才允许生产者生产

生产者类

package com.goodwe.entity;import java.util.Queue;/*** @Author : Wang Huyun* @Creation time : 2019/5/21  15:06* @Title:生产者*/
public class Producer implements Runnable {private Queue<String> queue;private final int maxSize;public Producer(Queue<String> queue, int maxSize) {this.queue = queue;this.maxSize = maxSize;}@Overridepublic void run() {produce();}void produce() {try {synchronized (queue) {while (true) {if (queue.size() == maxSize) {System.out.println("仓库已满,等待消费者消费!");queue.wait();}queue.add("产品");Thread.sleep(1000);System.out.println("生产者正在生产");queue.notifyAll();}}} catch (InterruptedException e) {e.printStackTrace();}}
}

消费者类

package com.goodwe.entity;import java.util.Queue;/*** @Author : Wang Huyun* @Creation time : 2019/5/21  15:17* @Title:消费者*/
public class Consumer implements Runnable {private Queue<String> queue;public Consumer(Queue<String> queue) {this.queue = queue;}@Overridepublic void run() {consume();}void consume() {try {synchronized (queue) {while (true) {if (queue.isEmpty()) {System.out.println("仓库已空,等待生产者生产!");queue.wait();continue;}queue.remove();System.out.println("消费者正在消费");queue.notifyAll();Thread.sleep(1000);}}} catch (InterruptedException e) {e.printStackTrace();}}
}

主函数

package com.goodwe;import com.goodwe.entity.Consumer;
import com.goodwe.entity.Producer;import java.util.LinkedList;
import java.util.Queue;public class Main {public static void main(String[] args) {Queue<String> queue = new LinkedList<>();int maxSize = 5;Thread producer = new Thread(new Producer(queue, maxSize));Thread consumer = new Thread(new Consumer(queue));producer.start();consumer.start();}}

总结

作为生产者,当队列满时调用了队列的wait()方法,表示等待,并且此时释放了锁。作为消费者此时获取到锁并且移除队首元素时调用了notifyAll()方法,此时生产者由wait等待状态转换为唤醒状态,但注意!此时仅仅是线程被唤醒了,有了争夺CPU资源的资格,并不代表下一步就一定是生产者生产,还有可能消费者继续争夺了CPU资源。一定记住是被唤醒了,有资格争夺CPU资源。notifyAll()表示的是唤醒所有等待的线程,所有等待的线程被唤醒过后,都有了争夺CPU资源的权利,至于是谁会获得这个锁,那不一定。而如果是使用notify(),那就代表唤醒所有等待线程中的一个,只是一个被唤醒具有了争夺CPU的权力,其他没被唤醒的线程继续等待。如果等待线程就只有一个那么notify()和notifyAll()就没区别,不止一个那区别就大了,一个是只唤醒其中一个,一个是唤醒所有。唤醒不是代表这个线程就一定获得CPU资源一定获得锁,而是有了争夺的权利。

转载于:https://my.oschina.net/u/4100033/blog/3052322

使用同步锁来实现线程安全---生产者与消费者相关推荐

  1. java线程之生产者与消费者

    预习java线程的三种创建方式 package com.bj.thread;import java.util.concurrent.*;/*** @FileName: TestThread* @Rem ...

  2. Windows线程(生产者与消费者问题)

    Windows线程(生产者与消费者问题) 转载 佟强 2008.10.10 生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个进程地址空 ...

  3. JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池...

    /*** 多线程共享数据* 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行.* 多线程共享数据的安全问题,使用同步解决.* 线程同步两种方法: ...

  4. 同步锁 php,python线程中同步锁详解

    这篇文章主要为大家详细介绍了python线程中同步锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十 ...

  5. java同步锁售票_线程同步锁之火车站售票案例

    前言: 谈到多线程,就不得不说线程同步,那么什么是线程同步? 线程同步 即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作 ...

  6. 14.4 线程通讯-生产者与消费者

    package cn.chen.threadcommunication; /* 线程通讯:一个线程完成了自己的任务时,要通知另外一个线程去完成另一个任务.生产者与消费者wait(); 等待如果线程执行 ...

  7. java线程-从生产者和消费者模型说起

    今天学习了经典的生产者和消费者模型,引起了对java线程等知识的一系列的思考. 在平时的编程中,经常遇到一个线程要产生数据,而另一个线程要处理产生出来的数据,这其实就是生产者和消费者的关系.生产者在产 ...

  8. 笔记-13-多线程 Thread方法 线程安全 生产者和消费者 死锁和阻塞

    1.实现多线程 1.1简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 1.2并发和并行[理解] 并 ...

  9. java的知识点34——线程通信 || 生产者与消费者问题

    线程通信 应用场景:生产者和消费者问题 • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待, ...

最新文章

  1. 程序的编译和链接过程
  2. 21day学通python epub_21天就让你掌握Python语言,《21天学通Python》PDF版送给你去学...
  3. c#的DateTime.Now函数详解
  4. P2123-皇后游戏
  5. Bailian3752 走迷宫【BFS】
  6. 使用samba完成Linux服务器与Windows之间的映射
  7. c语言的程序的基本示例
  8. Java数据库连接协议JDBC学习
  9. 查看宽带虚拟拨号PPPoE的上网口令密码
  10. 重新审视Faster RCNN:优缺点与改进
  11. scratch编程 凯撒密码
  12. GUI学习之二十二——QRubberBand学习总结
  13. 爬虫 裁判文书网爬取part2
  14. 使用 Docker Compose 构建复杂的多容器 App
  15. 露营不在朋友圈,快乐在诗和远方
  16. luoguP1196 银河英雄传说(并查集)
  17. 2022年交通工具公开拍卖市场研究报告
  18. Android Service的启动过程
  19. 梯度下降算法动图_一文读懂梯度下降算法
  20. php 可以编辑treegrid,浅谈EasyUI中编辑treegrid的方法

热门文章

  1. 用计算机进行会计核算与手工会计核算,会计核算软件与手工会计核算软件有什么区别...
  2. VisualStudio/VS在一个项目中添加多个c++文件
  3. 手机虚拟服务器app,手机远程控制服务器的app
  4. .vimrc 错误 E484:打不开syntax.vim E185:Cannot find color scheme
  5. vs2019+opencv环境配置
  6. Charles的总结使用
  7. java 建立临时文件夹
  8. SMARTBI权限管理
  9. 《自控力》直面自身欲望,但不要付诸行动
  10. html5script计时器,javascript实现秒表计时器的制作方法