更多 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 实现生产者消费者模式相关推荐

  1. Java多线程学习三:有哪几种实现生产者消费者模式的方法

    我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦.消息队列等场景.在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时 ...

  2. Java并发程序设计(十一)设计模式与并发之生产者-消费者模式

    设计模式与并发之生产者-消费者模式 生产者-消费者模式是一个经典的多线程设计模式.它为多线程间的协作提供了良好的解决方案. 在生产者-消费者模式中,通常由两类线程,即若干个生产者线程和若干个消费者线程 ...

  3. Java并发编程实战~生产者-消费者模式

    前面我们在<Worker Thread 模式>中讲到,Worker Thread 模式类比的是工厂里车间工人的工作模式.但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就 ...

  4. java 消费者模式 多线程_[Java并发-24-并发设计模式] 生产者-消费者模式,并发提高效率...

    生产者 - 消费者模式在编程领域的应用非常广泛,前面我们曾经提到,Java 线程池本质上就是用生产者 - 消费者模式实现的,所以每当使用线程池的时候,其实就是在应用生产者 - 消费者模式. 当然,除了 ...

  5. 【Java】生产者消费者模式的三种实现

    原文地址:https://blog.csdn.net/u010983881/article/details/78554671 前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内 ...

  6. Java多线程(含生产者消费者模式详解)

    多线程 导航 多线程 1 线程.进程.多线程概述 2 创建线程 (重点) 2.1 继承Thread类(Thread类也实现了Runnable接口) 2.2 实现Runnable接口(无消息返回) 2. ...

  7. 【Java】生产者消费者模式的实现

    前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力.这个 ...

  8. java消费者模式_基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

  9. java生产线消费者,基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

最新文章

  1. MAC修改python和pip版本
  2. Educational Codeforces Round 64(Unrated for Div.1+Div. 2)
  3. 每日程序C语言7-将一个正整数分解质因数
  4. Java并发——结合CountDownLatch源码、Semaphore源码及ReentrantLock源码来看AQS原理
  5. .NET Framework 4.0 和 Dublin 中的 WCF 和 WF 服务 - z
  6. javaScript对象及初识面向对象
  7. 解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的问题
  8. Apache Spark 内存管理详解
  9. 数字后端基本概念-合集
  10. 优化大数据分析的五个小技巧
  11. python 分类算法的数据要归一化嘛_Python数据预处理:彻底理解标准化和归一化...
  12. 火狐浏览器扩展程序源代码的查看
  13. 幻方矩阵(魔方矩阵)
  14. 如何动态的修改安卓APP名字和桌面图标
  15. 小学生自学奥数必备的这些书籍
  16. 金山也推隐私保护器,我的隐私谁做主?
  17. wo-27s管理员账户和密码_开机密码忘了怎么解决
  18. 使用curl命令行工具查询本地公网IP地址
  19. re模块剩余和subprocess模块
  20. 北大暑期学校学习总结

热门文章

  1. MongDB与Spring整合及操作
  2. 逆向思维--魔兽世界封包分析(1)
  3. 磁盘管理第一章(分区与格式化)
  4. SDUT 贪心算法 删数问题
  5. 关于不能远程连接Linux中Mysql数据库的问题
  6. oracle存储过程的基本语法
  7. win8改win7笔记
  8. xCode自定义快捷键
  9. 10285 - Longest Run on a Snowboard
  10. 利用Eclipse开发Linux驱动