说明

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. python-简单邮件报警

    在scrapy爬虫项目中经常遇到 爬取数据时报错无法及时处理 导致数据爬取不完整 只能先查看log才能发现报错 首先写一个简单的邮件发送模块 """ @file: ema ...

  2. 小程序block标签配合if和else 和 动态修改标题栏

    <block wx:if="{{aaaa}}"> <view>aaaa为 true,显示</view> </block> <b ...

  3. Delphi 开发手机 App 与其他工具之间的比较分析

    写在前头 关于各种手机App开发的工具,从2010年前后到现在已经在很多不同的场合介绍过,在元智大学.中台科技大学.德霖科技大学等不同学校的讲座.课程当中,都有类似的主题,所以对我来说,这个主题属于驾 ...

  4. Java打包商用化软件

    这是我在博客中写的第一篇文章.还请各位大神们多多指教!我会详细讲解如何将我们由java的swing以及awt组件编写出的java可视化窗口程序编制成一个我们能够让用户使用的,商业化,可安装的软件.网上 ...

  5. FFmpeg 结构体学习(三): AVPacket 分析

    在上文FFmpeg 结构体学习(二): AVStream 分析我们学习了AVStream结构体的相关内容.本文,我们将讲述一下AVPacket. AVPacket是存储压缩编码数据相关信息的结构体.下 ...

  6. [Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  7. [Swift]LeetCode381. O(1) 时间插入、删除和获取随机元素 - 允许重复 | Insert Delete GetRandom O(1) - Duplicates allowed

    Design a data structure that supports all following operations in averageO(1) time. Note: Duplicate ...

  8. [Swift]LeetCode528. 按权重随机选择 | Random Pick with Weight

    Given an array w of positive integers, where w[i] describes the weight of index i, write a function  ...

  9. [C#]批量修改文件后缀名

    代码: /// <summary> /// 修改文件后缀 /// </summary> /// <param name="extension"> ...

  10. linux系统安装cdcfordb2udb

    最近接触到db2数据库实时复制的解决方案InfoSphere CDC(Change Database Capture) .主要是通过读取源端的日志信息对目标端进行数据的增删改,从而尽量减少对源端资源的 ...