`
uule
  • 浏览: 6357997 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Condition

 
阅读更多

Ojbect:

           wait\notify\notifyAll

Condition

           await\signal\signalAll

 

Condition接口API里使用两个condition是否有必要?

 

class BoundedBuffer {
    final Lock lock = new ReentrantLock();
    final Condition notFull = lock.newCondition();
    final Condition notEmpty = lock.newCondition();

    final Object[] items = new Object[100];
    int putptr,    takeptr,    count;

    public void put(Object x) throws InterruptedException {
        lock.lock();
        try {
            while (count == items.length) notFull.await();
            items[putptr] = x;
            if (++putptr == items.length) putptr = 0; ++count;
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    public Object take() throws InterruptedException {
        lock.lock();
        try {
            while (count == 0) notEmpty.await();
            Object x = items[takeptr];
            if (++takeptr == items.length) takeptr = 0; --count;
            notFull.signal();
            return x;
        } finally {
            lock.unlock();
        }
    }
}

 有必要,应为这样写程序会更加清晰,比以前使用Object的wait/notify。 一个Condition代表一种条件,这个条件里面有一个链表,那么2个条件就有2条等待链表。 只要在等待的队列上被唤醒才能继续,如果同时被2个条件控制,那么就要分别被2个唤醒才行,这么写的好处是粒度细,控制更精细,不像Object的是粗粒度的。

 

请问用一个Condition是不是可以达到同样的效果呢? 当然可以,结构上没那么清晰了,没有JDK1.5的并发之前还不是用Object提供的wait写生产者消费者队列的 不过,同一个队列关联多个条件断言,用signal就危险了,要用sinalAll

 

内置锁对象只有一个条件队列,显式锁可以通过newCondition方法创建多个条件队列,这样就可以避免不同的条件断言关联同一个条件队列造成的问题。

 

 

有多个线程往里面存数据和从里面取数据,其队列(先进先出后进后出)能缓存的最大数值是capacity,多个线程间是互斥的,当缓存队列中存储的值达到capacity时,将写线程阻塞,并唤醒读线程,当缓存队列中存储的值为0时,将读线程阻塞,并唤醒写线程

 

 

这就是多个Condition的强大之处,假设缓存队列中已经存满,那么阻塞的肯定是写线程,唤醒的肯定是读线程,相反,阻塞的肯定是读线程,唤醒的肯定是写线程,那么假设只有一个Condition会有什么效果呢,缓存队列中已经存满,这个Lock不知道唤醒的是读线程还是写线程了,如果唤醒的是读线程,皆大欢喜,如果唤醒的是写线程,那么线程刚被唤醒,又被阻塞了,这时又去唤醒,这样就浪费了很多时间!

 

ArrayBlockingQueue中也使用了这种技术。

Condition 条件变量,线程通信更高效的方式

 

 

 

分享到:
评论

相关推荐

    MyBatisPlus条件构造器Condition的用法示例代码

    在MyBatisPlus中,`Condition`类是用于构建动态SQL的重要工具,它可以实现灵活的条件查询,使得开发者无需手动拼接SQL语句。下面我们将详细介绍`Condition`类的使用方法,并通过示例代码来展示其功能。 首先,`...

    condition_variable源码以及详细分析.docx

    "condition_variable源码详细分析" Condition_Variable 是 C++11 中引入的一种线程同步机制,它提供了一个高效的方式来同步多个线程的执行顺序。在这篇文章中,我们将详细介绍 Condition_Variable 的使用方法和...

    前端项目-condition.zip

    【标题】"前端项目-condition.zip" 提供了一个高级条件库,名为 "condition.js-master",这显然关注的是前端开发中的条件逻辑处理。在前端开发中,条件语句是不可或缺的一部分,用于根据不同的条件执行不同的代码...

    java中的Lock类和Condition类.docx

    Java中的Lock类与Condition类是Java并发编程的重要组成部分,它们为多线程环境下的同步提供了更为灵活和强大的控制。在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁...

    spring缓存机制-根据condition加入缓存(三)

    本篇文章将详细讲解如何利用`condition`属性来控制哪些数据可以被缓存,以实现更加精细化的缓存策略。 ### 一、Spring缓存概述 Spring框架提供了一种统一的缓存抽象,支持多种缓存实现,如EhCache、Hazelcast、...

    Java多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    - **Condition**:`ReentrantLock`支持多个条件变量,每个`Condition`对象都有自己的等待队列,可以实现更细粒度的同步控制。与`synchronized`的`wait()`和`notifyAll()`不同,`Condition`提供了`await()`和`signal...

    Run Condition Plugin 1.0

    Run Condition Plugin 1.0 hpi

    线程通信(Condition) 实例

    线程通信(Condition)实例,完整的代码文件,你只需要编译运行即可,就可以看看结果,然后分析。

    springboot通过@Condition注解类型完成加载配置内容

    通过@Bean和@Condition 注解自定义对于的condition里面根据自定义的条件实现指定类注入到spring中;@ConditionalOnProperty可以根据配置文件中的 属性值不同将不同的类注入到spring中 该资源中案例完整,代码简单移动

    SQL_CONDITION.rar_condition sql_condition sql_sql where conditi

    本文将深入探讨`WHERE`条件类在SQL查询中的使用,以及如何结合`SQL_CONDITION`来构建更复杂的查询语句。 首先,我们要明白`WHERE`子句的基本用法。`WHERE`关键字后跟一个或多个条件表达式,这些表达式用于定义要...

    tomcat-redis-session-manager-tomcat-7.jar解决race condition问题

    解决race condition问题,根据git最新源码编译

    Java concurrency之Condition条件_动力节点Java学院整理

    在Java并发编程中,`Condition`接口是Java并发包(java.util.concurrent)中的一个重要组成部分,它提供了比`synchronized`关键字更为精细的线程同步和唤醒机制。`Condition`允许我们创建多个独立的等待队列,每个...

    rest_condition, Django rest框架的复杂权限流( http.zip

    rest_condition, Django rest框架的复杂权限流( http rest_conditiondjango-rest-framework的复杂权限流。安装安装最新版本的最简单方法是使用 pip/easy_install从PyPI中提取它:pip install rest_condit

    Java条件变量的深度应用:使用Condition接口实现同步等待

    Java通过java.util.concurrent.locks包中的Condition接口提供了条件变量的实现。本文将详细介绍Condition接口的工作原理、使用方法以及如何在实际项目中应用它。 Condition接口是Java并发编程中实现等待/通知模式的...

    race-condition-exploit, 帮助开发web应用程序竞争条件的工具.zip

    race-condition-exploit, 帮助开发web应用程序竞争条件的工具 竞争条件利用帮助开发web应用程序竞争条件的工具用法$ python rc-exploit --helpusage: rc-exploit [-h] [--threads THREADS] plugin.. .Ra

    线程并发控制condition互斥量 多线程写的:生产者、消费者问题

    线程并发控制condition 互斥量 多线程写的:生产者、消费者问题

    Java学习资料-详解Condition的await和signal等待/通知机制

    在Java多线程编程中,`Condition`是Java并发包`java.util.concurrent.locks`中的一个接口,它提供了比`Object`类中的`wait()`、`notify()`和`notifyAll()`更加灵活和强大的线程间通信机制。`Condition`与`Lock`配合...

    JavaLock与Condition的理解Reentran

    本文将深入探讨JavaLock中的ReentrantLock(可重入锁)以及与其紧密相关的Condition接口,帮助你理解它们的工作原理和应用场景。 **一、ReentrantLock可重入锁** ReentrantLock是Java.util.concurrent.locks包下的...

    IfCondition结构1

    在TensorRT中,`IfCondition`结构用于构建条件分支网络,允许模型在运行时根据输入数据的特定条件选择执行不同的计算路径。这对于处理具有条件逻辑的复杂神经网络模型尤其有用。在提供的初始示例代码中,`If...

Global site tag (gtag.js) - Google Analytics