java多线程 生产者和消费者 lock
package com.atguigu.thread.lock; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /*
* 小米厂家:
* 库房有限,只能存10台小米电视
* 工人的生产电视与销售的卖电视同时进行
* 当工人生产电视把库房存满了,要求工人休息,直到销售卖出至少一台电视,库房可以再次电视,然后他再次开始生产
* 当销售者把库房的电视都卖完了,要求销售者休息,直到工人生产了至少一台电视,销售才继续卖电视
*
* 工人是一个线程
* 销售是一个线程
*
* 需要线程的通信:当工人休息后,销售组销售了电视,应该告知工人一声,可以继续生产了
* 当销售休息后,工人如果生产了电视,应该通知销售,可以开始卖电视了
*
* 问题:
* (1)因为共享num变量,所以有线程安全问题:依靠同步解决
* (2)因为库房有限:线程通信 wait,notify
*
* 涉及到的方法:
* (1)wait:等待
* (2)notify/notifyAll:通知
*
* 这两个方法必须由“锁”对象来调用
* “锁”对象,必须是多个线程共享的锁对象
*
* 如果是多个工人,多个销售者
*
* synchronized:隐式锁
* wait
* notify/notifyAll
*
* 如果使用Lock锁,那么线程通信应该使用Condition来解决通信
* 条件.await():某种条件,等待
* 条件.signal():某种条件唤醒
*
*/
public class TestTongXin { public static void main(String[] args) {
Houseware h = new Houseware(); Worker w1 = new Worker(h);
Worker w2 = new Worker(h);
Saler s1 = new Saler(h);
Saler s2 = new Saler(h); w1.start();
w2.start();
s1.start();
s2.start();
} }
class Houseware{
private static final int MAX_VALUE = 10;
private int num = 0;
private Lock lock = new ReentrantLock();
private Condition full = lock.newCondition();
private Condition empty = lock.newCondition(); //往里放电视
public void add(){
lock.lock();
if(num>=MAX_VALUE){
try {
full.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
num++;
try {
Thread.sleep(100);//为了问题暴露的明显一点
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("工人生产了一台电视,现在库存是:" + num);
// empty.signal();
empty.signalAll();
} lock.unlock();
} //往外拿电视
public void take(){
lock.lock();
if(num<=0){
try {
empty.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
num--;
try {
Thread.sleep(100);//为了问题暴露的明显一点
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("销售卖了一台电视,现在库存是:" + num);
full.signalAll();
} lock.unlock();
}
} class Worker extends Thread{
private Houseware h; public Worker(Houseware h) {
super();
this.h = h;
} public void run(){
//往仓库放电视
// 库房.add();
while(true){
h.add();
}
}
}
class Saler extends Thread{
private Houseware h; public Saler(Houseware h) {
super();
this.h = h;
} public void run(){
while(true){
h.take();
}
}
}
java多线程 生产者和消费者 lock的更多相关文章
- Java 多线程-生产者、消费者
一.整体代码 ThreadDemo.java public class ThreadDemo { public static void main(String[] args) { Godown god ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- Windows下RabbitMQ 的下载、配置、Java实现生产者和消费者例子
RabbitMQ是一个轻量级的消息代理中间件,支持多种消息通信协议,支持分布式部署,支持运行于多个操作系统,具有灵活.高可用等特性.RabbitMQ支持多种协议,其中最为重要的是高级消息队列协议(AM ...
- java实现生产者和消费者问题
Java实现生产者和消费者问题 欢迎访问我的个人博客,获取更多有用的东西 链接一 链接二 也可以关注我的微信订阅号:CN丶Moti
- Java中生产者与消费者模式
生产者消费者模式 首先来了解什么是生产者消费者模式.该模式也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线 ...
- Java实现生产者和消费者
生产者和消费者问题是操作系统的经典问题,在实际工作中也常会用到,主要的难点在于协调生产者和消费者,因为生产者的个数和消费者的个数不确定,而生产者的生成速度与消费者的消费速度也不一样,同时还要实现生产者 ...
- python多线程+生产者和消费者模型+queue使用
多线程简介 多线程:在一个进程内部,要同时干很多事情,就需要同时执行多个子任务,我们把进程内的这些子任务叫线程. 线程的内存空间是共享的,每个线程都共享同一个进程的资源 模块: 1._thread模块 ...
- java之生产者与消费者
package com.produce; import java.util.LinkedList; import java.util.Queue; /*@author shijin * 生产者与消费者 ...
- java线 生产者和消费者
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
随机推荐
- Android 样式的开发(转)
Android(2) 目录(?)[-] rectangle oval line ring layer-list篇 普通图片 bitmap标签 点九图片 nine-patch标签 color标签 ...
- MyBatis xml配置文件详解
http://blog.csdn.net/fenghuibian/article/details/52525671
- echart css样式弄了几个月了,样式一直都没有好好解决,好激动
legend 图例,每个图表最多仅有一个图例.try this » 名称 默认值 描述 {string} orient 'horizontal' 布局方式,默认为水平布局,可选为:'horizonta ...
- python3字典:获取json响应值来进行断言
前言:在接口自动化测试中,最后都是需要将返回结果进行断言.本文按照实际情况举例说明字典各种操作,以及如何提取响应数据来进行断言 1.dict = {'code': '200', 'message': ...
- Mysql:查询每个月下的数据,根据状态或者年份的sql语句
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本次的MySQL开篇记录了一道面试题,我给其扩展一下 这面试题它难点在什么地方,不外乎是操作月份和将其展示的 ...
- SSM-SpringMVC-21:SpringMVC中处理器方法之返回值Object篇
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 今天要记录的是处理方法,返回值为Object的那种,我给它分了一下类: 1.返回值为Object数值(例如1) ...
- javascript 内存管理
1.垃圾回收机制 在编写Javascript程序时,开发人员不用关心内存问题,内存分配及无用内存的回收完全实现了自动化管理.垃圾收集器会按照预定的时间间隔, 周期性的找出那些不再继续使用的变量,然后释 ...
- jQuery学习之旅 Item4 细说DOM操作
jQuery-–DOM操作(文档处理) Dom是Document Object Model的缩写,意思是文档对象模型.DOM是一种与浏览器.平台.语言无关的接口,使用该接口可以轻松访问页面中所有的标准 ...
- java Queue中 add/offer,element/peek,remove/poll区别
转自https://blog.csdn.net/u012050154/article/details/60572567 java Queue中 add/offer,element/peek,remov ...
- MySQL 大表优化方案
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...