java lock condition_Java 通过 Lock 和 竞争条件 Condition 实现生产者消费者模式
更多 Java 并发编程方面的文章,请参见文集《Java 并发编程》
竞争条件
多个线程共享对某些变量的访问,其最后结果取决于哪个线程偶然在竞争中获胜。
condition.await():类似于 obj.wait()
condition.signal():类似于 obj.notify()
condition.signalAll():类似于 obj.notifyAll()
竞争条件 Condition 对比 obj.wait() obj.notify() 的优势
可以建立不同的多个 Condition,针对不同的竞争条件,例如:
Condition isFullCondition = lock.newCondition();
Condition isEmptyCondition = lock.newCondition();
关于 通过 wait 和 notify 实现生产者消费者模式,可以参考 链接。
利用 Lock 和 竞争条件 Condition 也可以实现生产者消费者模式,代码如下:
public class Condition_Test {
private static final int MAX_CAPACITY = 10;
private static List goods = new ArrayList();
private static final Lock lock = new ReentrantLock();
private static final Condition isFullCondition = lock.newCondition();
private static final Condition isEmptyCondition = lock.newCondition();
public static void main(String[] args) {
(new ProducerThread()).start();
(new ConsumerThread()).start();
}
static class ProducerThread extends Thread {
public void run() {
while (true) {
// 每隔 1000 毫秒生产一个商品
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// 获得锁,相当于 synchronized
lock.lock();
// 当前商品满了,生产者等待
if (goods.size() == MAX_CAPACITY) {
try {
System.out.println("Goods full, waiting...");
isEmptyCondition.await();
} catch (Exception e) {
}
}
goods.add(new Object());
System.out.println("Produce goods, total: " + goods.size());
// isFullCondition.signal() 也可以
isFullCondition.signalAll();
// 记住要释放锁
lock.unlock();
}
}
}
static class ConsumerThread extends Thread {
public void run() {
while (true) {
// 每隔 500 毫秒消费一个商品
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
// 获得锁,相当于 synchronized
lock.lock();
// 当前商品空了,消费者等待
if (goods.size() == 0) {
try {
System.out.println("No goods, waiting...");
isFullCondition.await();
} catch (Exception e) {
}
}
goods.remove(0);
System.out.println("Consume goods, total: " + goods.size());
// isEmptyCondition.signal() 也可以
isEmptyCondition.signalAll();
// 记住要释放锁
lock.unlock();
}
}
}
}
Condition 的实现原理
Condition 的内部实现是使用节点链来实现的,每个条件实例对应一个节点链,我们有 isFullCondition 和 isEmptyCondition 两个条件实例,所以会有两个等待节点链。当对应条件被 signal 的时候,就会把等待节点转移到同步队列中,继续竞争锁。
java lock condition_Java 通过 Lock 和 竞争条件 Condition 实现生产者消费者模式相关推荐
- Java多线程学习三:有哪几种实现生产者消费者模式的方法
我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦.消息队列等场景.在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时 ...
- Java并发程序设计(十一)设计模式与并发之生产者-消费者模式
设计模式与并发之生产者-消费者模式 生产者-消费者模式是一个经典的多线程设计模式.它为多线程间的协作提供了良好的解决方案. 在生产者-消费者模式中,通常由两类线程,即若干个生产者线程和若干个消费者线程 ...
- Java并发编程实战~生产者-消费者模式
前面我们在<Worker Thread 模式>中讲到,Worker Thread 模式类比的是工厂里车间工人的工作模式.但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就 ...
- java 消费者模式 多线程_[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率...
生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...
- 【Java】生产者消费者模式的三种实现
原文地址:https://blog.csdn.net/u010983881/article/details/78554671 前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内 ...
- Java多线程(含生产者消费者模式详解)
多线程 导航 多线程 1 线程.进程.多线程概述 2 创建线程 (重点) 2.1 继承Thread类(Thread类也实现了Runnable接口) 2.2 实现Runnable接口(无消息返回) 2. ...
- 【Java】生产者消费者模式的实现
前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力.这个 ...
- java消费者模式_基于Java 生产者消费者模式(详细分析)
生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...
- java生产线消费者,基于Java 生产者消费者模式(详细分析)
生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...
最新文章
- MAC修改python和pip版本
- Educational Codeforces Round 64(Unrated for Div.1+Div. 2)
- 每日程序C语言7-将一个正整数分解质因数
- Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理
- .NET Framework 4.0 和 Dublin 中的 WCF 和 WF 服务 - z
- javaScript对象及初识面向对象
- 解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的问题
- Apache Spark 内存管理详解
- 数字后端基本概念-合集
- 优化大数据分析的五个小技巧
- python 分类算法的数据要归一化嘛_Python数据预处理:彻底理解标准化和归一化...
- 火狐浏览器扩展程序源代码的查看
- 幻方矩阵(魔方矩阵)
- 如何动态的修改安卓APP名字和桌面图标
- 小学生自学奥数必备的这些书籍
- 金山也推隐私保护器,我的隐私谁做主?
- wo-27s管理员账户和密码_开机密码忘了怎么解决
- 使用curl命令行工具查询本地公网IP地址
- re模块剩余和subprocess模块
- 北大暑期学校学习总结