说明

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简化生产者消费者模式代码的更多相关文章

  1. Java并发编程()阻塞队列和生产者-消费者模式

    阻塞队列提供了可阻塞的put和take方法,以及支持定时的offer和poll方法.如果队列已经满了,那么put方法将阻塞直到有空间可用:如果队列为空,那么take方法将会阻塞直到有元素可用.队列可以 ...

  2. java多线程15 :wait()和notify() 的生产者/消费者模式

    什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...

  3. Java 学习笔记 网络编程 使用Socket传输文件 CS模式

    Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...

  4. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  5. java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

    java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了  wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样 ...

  6. Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition

    锁的概念 从jdk发行1.5版本之后,在原来synchronize的基础上,增加了重入锁ReentrantLock. 本文就不介绍synchronize了,有兴趣的同学可以去了解一下,本文重点介绍Re ...

  7. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  8. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  9. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

随机推荐

  1. docker kubernetes Swarm容器编排k8s CICD部署

    1docker版本 docker 17.09 https://docs.docker.com/ appledeAir:~ apple$ docker version Client: Docker En ...

  2. BUAA-OO-第一单元总结

    BUAA-OO第一单元博客总结 第一次作业总结 (1)类关系图 第一次作业类图关系简单,仅有一个Poly封装类以及一个Main主类调用Poly,Poly封装类内部完成了包括对象构造,求导,生成字符串的 ...

  3. laravel 邮件配置

    .env的配置 MAIL_DRIVER=smtpMAIL_HOST=smtp.163.comMAIL_PORT=465MAIL_USERNAME=你的163邮箱地址MAIL_PASSWORD=你的16 ...

  4. C#嵌套类

    { "children" : [{ "children" : [{ "children" : [], "name" : ...

  5. 微服务(Microservices)和服务网格(Service Mesh)架构概念整理

    注:文章内容为摘录性文字,自己阅读的一些笔记,方便日后查看. 微服务(Microservices) 在过去的 2016 年和 2017 年,微服务技术迅猛普及,和容器技术一起成为这两年中最吸引眼球的技 ...

  6. FFmpeg 结构体学习(八):FFMPEG中重要结构体之间的关系

    FFMPEG中结构体很多.最关键的结构体可以分成以下几类: 解协议(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议 ...

  7. [Swift]LeetCode8. 字符串转整数 (atoi) | String to Integer (atoi)

    Implement atoi which converts a string to an integer. The function first discards as many whitespace ...

  8. [Swift]LeetCode1020. 飞地的数量 | Number of Enclaves

    Given a 2D array A, each cell is 0 (representing sea) or 1 (representing land) A move consists of wa ...

  9. 使用jquery日期选择器flatpickr.js,使用js动态创建input元素时插件失效

    最近写页面时需要用到,日期选择器,网上搜索了一些插件,最后使用了flatpickr.js.我是从npm 上拉下的依赖  npm install flatpickr --save 随后在页面中引入css ...

  10. HBase之CF持久化系列(续3——完结篇)

    相信大家在看了该系列的前两篇文章就已经对其中的持久化有比较深入的了解.相对而言,本节内容只是对前两节的一个巩固.与持久化相对应的是打开文件并将其内容读入到内存变量中.而在本节,我就来介绍这一点. 本节 ...