`
qindongliang1922
  • 浏览: 2184284 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117541
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125928
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59923
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71301
社区版块
存档分类
最新评论

Condition 条件变量的使用

阅读更多
条件(也称为条件队列 或条件变量)为线程提供了一个含义,以便在某个状态条件现在可能为 true 的另一个线程通知它之前,一直挂起该线程(即让其“等待”)。因为访问此共享状态信息发生在不同的线程中,所以它必须受保护,因此要将某种形式的锁与该条件相关联。等待提供一个条件的主要属性是:以原子方式 释放相关的锁,并挂起当前线程,就像 Object.wait 做的那样



在Condition中,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll(),传统线程的通信方式,Condition都可以实现。
条件变量类似JDK1.4或以前版本中的 Object.wait(); Object.notify(); Object.notifyAll();
值得注意的是当condition.await()时,隐式的将条件变量关联的Lock解锁,而使其他线程有机会获得Lock,而检查条件,并在条件满足时,等待在条件变量上。

示例代码,ArrayBlockingQueue源码摘取:


    /** Main lock guarding all access */  
    private final ReentrantLock lock;  
    /** Condition for waiting takes */  
    private final Condition notEmpty;  
    /** Condition for waiting puts */  
    private final Condition notFull;  
    /** 
     * Inserts the specified element at the tail of this queue, waiting 
     * for space to become available if the queue is full. 
     * 
     * @throws InterruptedException {@inheritDoc} 
     * @throws NullPointerException {@inheritDoc} 
     */  
    public void put(E e) throws InterruptedException {  
     if (e == null) throw new NullPointerException();  
     final E[] items = this.items;  
     final ReentrantLock lock = this.lock;  
     lock.lockInterruptibly();  
     try {  
      try {  
       while (count == items.length)  
        notFull.await();  
      } catch (InterruptedException ie) {  
       notFull.signal(); // propagate to non-interrupted thread  
       throw ie;  
      }  
      insert(e);  
     } finally {  
      lock.unlock();  
     }  
    }  
    public E take() throws InterruptedException {  
     final ReentrantLock lock = this.lock;  
     lock.lockInterruptibly();  
     try {  
      try {  
       while (count == 0)  
        notEmpty.await();  
      } catch (InterruptedException ie) {  
       notEmpty.signal(); // propagate to non-interrupted thread  
       throw ie;  
      }  
      E x = extract();  
      return x;  
     } finally {  
      lock.unlock();  
     }  
    }  



有多个线程往里面存数据和从里面取数据,其队列(先进先出后进后出)能缓存的最大数值是capacity,多个线程间是互斥的,当缓存队列中存储的值达到capacity时,将写线程阻塞,并唤醒读线程,当缓存队列中存储的值为0时,将读线程阻塞,并唤醒写线程
这就是多个Condition的强大之处,假设缓存队列中已经存满,那么阻塞的肯定是写线程,唤醒的肯定是读线程,相反,阻塞的肯定是读线程,唤醒的肯定是写线程,那么假设只有一个Condition会有什么效果呢,缓存队列中已经存满,这个Lock不知道唤醒的是读线程还是写线程了,如果唤醒的是读线程,皆大欢喜,如果唤醒的是写线程,那么线程刚被唤醒,又被阻塞了,这时又去唤醒,这样就浪费了很多时间!


本篇非原创转自:http://cuisuqiang.iteye.com/blog/2019251
分享到:
评论

相关推荐

    多线程之条件变量

    在Java中,条件变量是`java.util.concurrent.locks.Condition`接口的实现,通常与锁(如`ReentrantLock`)一起使用。在C++的`std::condition_variable`库中,也有类似的实现。下面我们将深入探讨条件变量的概念、...

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

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

    互斥锁与条件变量详解 疑问全解

    下面,我们将详细解释互斥锁和条件变量的工作机制、使用场景和注意事项。 互斥锁(Mutex) 互斥锁是最基本的同步机制,它用于保护共享资源免受多个线程同时访问的干扰。互斥锁可以是普通锁(PTHREAD_MUTEX_TIMED_...

    C++跨平台条件变量和互斥锁封装

    本示例着重讲解如何利用C++标准库中的互斥锁(mutex)和条件变量(condition variable)进行线程同步,并实现跨平台的封装。这些工具是多线程编程中的关键组成部分,用于确保共享资源的安全访问。 首先,让我们了解...

    互斥锁、条件变量、信号量总结

    条件变量(Condition Variable)则是为了解决这一问题而引入的。条件变量允许线程在资源不满足其工作条件时,主动释放锁并进入等待状态。其他线程可以在适当的时候唤醒这些等待的线程。条件变量通常与互斥锁一起使用...

    linux无亲缘关系进程间通信(互斥锁+条件变量+共享内存)

    本示例中提到的“linux无亲缘关系进程间通信”着重讲解了如何利用互斥锁(Mutex)、条件变量(Condition Variable)以及共享内存(Shared Memory)这三种机制来实现非父子进程间的同步通信。 1. **互斥锁**:互斥锁...

    linux无亲缘关系间进程同步通信实现(互斥锁+条件变量+共享内存模式)

    2. **条件变量(Condition Variable)**: 条件变量允许进程在特定条件满足时才继续执行。它与互斥锁配合使用,可以在等待某个条件时,释放锁并进入休眠状态,条件改变时,由其他进程唤醒。在C语言中,`pthread_...

    linux条件变量简单讲解.pdf

    条件变量通常与互斥锁(mutex)一起使用,以避免竞争条件(Race Condition)和确保线程间的同步。本篇讲解将详细介绍Linux条件变量的基本概念、使用方法及其相关函数。 首先,条件变量是一种线程间通信的同步机制,...

    C++11 并发指南五(stdcondition_variable 详解).docx

    std::condition_variable 是 C++11 标准中 <condition_variable> 头文件里的一个类,用于实现条件变量的功能。条件变量是一种同步机制,允许线程在某个条件下等待或被唤醒。 std::condition_variable 的主要功能是...

    C++多线程中的锁和条件变量使用教程

    C++多线程中的锁和条件变量使用教程 在C++多线程编程中,锁和条件变量是两个非常重要的概念,它们都是用于解决多线程之间的同步和通信问题的。下面我们将详细地介绍锁和条件变量的使用。 一、锁(Mutex) 锁是多...

    kettle8 模拟表输入查询表名,然后在另一个表输入中使用变量使用

    例如,你可以通过执行SQL(如`SELECT tablename FROM sometable WHERE condition`)获取表名,然后使用`row.setVariable("tableName", tablename);`将结果存入变量。 3. **使用变量**:在另一个“表输入”步骤中,...

    线程池.zip,互斥锁+条件变量+队列,实现线程池,包括线程池的创建,塞任务,和销毁线程池

    条件变量(Condition Variable): 条件变量允许线程在特定条件满足时才继续执行。在实现线程池时,可能使用条件变量来通知线程何时有新任务到来或者线程池是否已关闭。线程可以等待条件变量,只有当其他线程改变...

    linux线程池 条件变量

    条件变量(Condition Variables)是线程同步的一种工具,它允许线程在满足特定条件时等待,只有当其他线程改变了这个条件,等待的线程才会被唤醒。条件变量与互斥锁(Mutexes)配合使用,可以实现更灵活的线程同步...

    Linux系统编程-(pthread)线程通信(条件变量).pdf

    在多线程编程中,线程间的通信是非常重要的,条件变量(Condition Variables)是POSIX线程(pthread)库提供的一种同步机制,它允许线程在特定条件满足时才能继续执行。在Linux系统编程中,条件变量通常与互斥锁...

    Python线程条件变量Condition原理解析

    Python中的线程条件变量(Condition)是多线程编程中的一种同步机制,它允许线程在特定条件下等待,直到其他线程改变这个条件并通知它们。条件变量通常与锁一起使用,确保在进行条件检查和操作时数据的一致性。 在...

    多线程编程中条件变量和虚假唤醒(spurious wakeup)的讨论

    在多线程编程中,条件变量(Condition Variables)是一个重要的同步机制,用于线程间的通信和协调。条件变量允许线程等待某个特定条件的发生,并在条件满足时被其他线程唤醒。然而,条件变量存在一个特性,即虚假...

    condition_variable源码以及详细分析.docx

    Condition_Variable 的构造函数中初始化了条件变量,并在析构函数中销毁了条件变量。 Condition_Variable 的 wait() 函数使用 pthread_cond_wait() 函数来实现等待操作,而 notify_one() 和 notify_all() 函数使用...

    abb输出,使用多线程配合互斥锁及条件变量来实现,C++源码演示

    本文将详细解析如何利用多线程、互斥锁(mutex)以及条件变量(condition variable)来实现特定的“abb”输出模式。我们将通过分析提供的“abb_out.sln”解决方案文件和“abb_out”源代码文件,探讨这一技术的应用。...

    操作系统实验 线程同步机制

    在 Nachos 操作系统中,条件变量是通过 Condition 类来实现的。 Condition 类中有三个主要的方法:Wait()、Signal() 和 BroadCast()。Wait() 方法用于线程等待条件变量的出现,当前线程将释放锁并进入睡眠状态。...

Global site tag (gtag.js) - Google Analytics