Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码
说明
ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口
我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notifyall方法和wait方法去写我们的生产者消费者模式。
这样就可以大大简化我们的代码
代码
Producer.java
package producterandcustomer;
import java.util.List;
import java.util.concurrent.locks.Lock;
/**
* @author StarsOne
* @date Create in 2019-4-13 0013 14:51:21
* @description
*/
class Producter extends Thread {
List<Object> warehouse;
private String name;
Lock lock;
public Producter(List<Object> warehouse, String name, Lock lock) {
this.warehouse = warehouse;
this.name = "生产者" + name;
//多态,ReentarntLock实现了Lock的接口,所以可以传进来
this.lock = lock;
}
@Override
public void run() {
while (true) {
//加锁
lock.lock();
try {
if (warehouse.size() < 10) {
warehouse.add(new Object());
System.out.println(name + "生产1件" + "当前仓库有" + warehouse.size() + "件");
}
} finally {
//解锁
lock.unlock();
}
try {
sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Consumer.java
package producterandcustomer;
import java.util.List;
import java.util.concurrent.locks.Lock;
/**
* @author StarsOne
* @date Create in 2019-4-13 0013 14:51:21
* @description
*/
class Cuotmer extends Thread{
List<Object> warehouse;
private String name;
Lock lock;
public Cuotmer(List<Object> warehouse, String name, Lock lock) {
this.warehouse = warehouse;
this.name = "消费者"+name;
this.lock = lock;
}
@Override
public void run() {
while (true) {
//加锁
lock.lock();
try {
if (warehouse.size() > 0) {
warehouse.remove(0);
System.out.println(name+"消费1件"+"当前仓库有"+warehouse.size()+"件");
}
}finally {
//最后释放
lock.unlock();
}
try {
sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Test.java
package producterandcustomer;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author StarsOne
* @date Create in 2019-4-13 0013 14:57:26
* @description
*/
class Test {
public static void main(String[] args) {
List<Object> warehouse = new ArrayList<>();
Lock lock = new ReentrantLock();
new Cuotmer(warehouse, "小米", lock).start();
new Cuotmer(warehouse, "小蓝", lock).start();
new Cuotmer(warehouse, "小浩", lock).start();
new Cuotmer(warehouse, "小家", lock).start();
new Cuotmer(warehouse, "小留", lock).start();
new Producter(warehouse, "小一", lock).start();
new Producter(warehouse, "小二", lock).start();
new Producter(warehouse, "小香", lock).start();
new Producter(warehouse, "小叫", lock).start();
new Producter(warehouse, "小三", lock).start();
}
}
Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码的更多相关文章
- Java并发编程()阻塞队列和生产者-消费者模式
阻塞队列提供了可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put方法将阻塞直到有空间可用:如果队列为空,那么take方法将会阻塞直到有元素可用.队列可以 ...
- java多线程15 :wait()和notify() 的生产者/消费者模式
什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...
- Java 学习笔记 网络编程 使用Socket传输文件 CS模式
Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现
java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了 wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样 ...
- Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
锁的概念 从jdk发行1.5版本之后,在原来synchronize的基础上,增加了重入锁ReentrantLock. 本文就不介绍synchronize了,有兴趣的同学可以去了解一下,本文重点介绍Re ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
随机推荐
- 手动安装composer详细教学
1.下载compser.phar 地址 https://getcomposer.org/download/ 2.新建composer.bat 文件,写入“@php "%~dp0compose ...
- python基础之面向对象1
一.面向对象VS面向过程 1.面向过程 2.面向对象 二.类与对象 1.类和对象 (1)基本概念 类和对象的内存图如下: 2.实例成员 (1)实例变量 (2)实例方法: 3.类成员: (1)类变量 ( ...
- 高德Location
1.创建Demo,获取key 打开高德开发平台 → 我的应用 → 创建应用 → 创建新Key 说明: 1.发布版安全码获取:用自己的签名打包成apk安装软件,用SHA1工具查看 2.调试版安全码获取: ...
- 学用HBuilder开发App的看过来
自己的呕心沥血之作吧,花了一年时间,系统介绍HTML5 App开发的相关技术. 越来越多的公司采用HTML5来快速开发移动跨平台App,它支持当前市场流行的移动设备. 本书主要介绍了HTML5在移动A ...
- jsp中input获得后台传递的值
1.后台赋值 req.setAttribute("openId",openId); 2.前台获取值 value="<%= request.getAttribute( ...
- MapReduce计算模型的优化
MapReduce 计算模型的优化涉及了方方面面的内容,但是主要集中在两个方面:一是计算性能方面的优化:二是I/O操作方面的优化.这其中,又包含六个方面的内容. 1.任务调度 任务调度是Hadoop中 ...
- 利用 python 实现对web服务器的目录探测
一.pythonPython是一种解释型.面向对象.动态数据类型的高级程序设计语言.python 是一门简单易学的语言,并且功能强大也很灵活,在渗透测试中的应用广泛,让我们一起打造属于自己的渗透测试工 ...
- 分门别类总结Java中的各种锁,让你彻底记住
概念 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁. 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁.有可能,会造成优先级反转或者饥 ...
- Python 爬虫入门(二)——爬取妹子图
Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...
- [Swift]LeetCode191. 位1的个数 | Number of 1 Bits
Write a function that takes an unsigned integer and return the number of '1' bits it has (also known ...