Condition

Condition是Object里面的wait、notify、notifyAll方法的一个替换
Where a Lock replaces the use of synchronized methods and statements, a Condition replaces the use of the Object monitor methods.
锁(Lock)替换了synchronized 方法和synchronized 代码块,条件(Condition)替换了Object类里面的监视器方法如:wait、notify、notifyAll

Condition的await或者signal方法必须在持有锁的时候调用,即在lock.lock()及lock.unlock()之间调用

如果当前线程没有持有锁就去调用Condition的await或者signal方法,将抛出一个IllegalMonitorStateException异常

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();
       }
     }
   }

await方法:进入等待状态

Causes the current thread to wait until it is signalled or interrupted.
调用该方法将会使当前线程进入等待状态,知道收到signal信号或者被中断。
如果一个线程进入wait状态,如下情况能够唤醒:
一、其他线程调用了signal方法、并且当前线程正好被选中唤醒。
二、其他线程调用了signalAll方法。
三、其他线程中断了( interrupts)当前线程。
四、发生了伪唤醒。
不管发生上面的哪一种情况,当前线程都需要重新获取锁。

awaitNanos方法:等待指定时间

awaitUninterruptibly方法:进入等待状态,interrupt对这个等待无效,忽略中断请求

signal方法:唤醒等待线程中的其中一个

signalAll方法:唤醒所有正在等待的线程

时间: 2024-08-31 22:44:16

Condition的相关文章

MySQL Index Condition Pushdown(ICP)性能优化方法实例

  这篇文章主要介绍了MySQL Index Condition Pushdown(ICP)性能优化方法实例,本文讲解了概念介绍.原理.实践案例.案例分析.ICP的使用限制等内容,需要的朋友可以参考下 一 概念介绍 Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式. a 当关闭ICP时,index 仅仅是data access 的一种访问方式,存储引擎通过索引回表获取的数据会传递到MySQL Ser

condition.await()并发问题

问题描述 condition.await()并发问题 public class BlockArrayList extends ArrayList { /** * long serialVersionUID:TODO(用一句话描述这个变量表示什么) * * @since 1.0.0 */ private static final long serialVersionUID = 1L; private ReentrantLock lock = new ReentrantLock(); private

Lock&Condition实现线程同步通信

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ConditionCommunication {     final Business business = new Business();     public static void main(Stri

C++11中的mutex, lock,condition variable实现分析

本文分析的是llvm libc++的实现:http://libcxx.llvm.org/ C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装.不过里面也有很多细节值得学习. std::mutex 先来看下std::mutex: 包增了一个pthread_mutex_t __m_,很简单,每个函数该干嘛就干嘛. class mutex { pthread_mutex_t __m_; public: mutex() _NOEXCEPT {__m

多线程 同步 lock-JAVA中,一个Lock锁中多个condition监视器的问题

问题描述 JAVA中,一个Lock锁中多个condition监视器的问题 2C 在一个同步程序中,如果定义了一个Lock锁,同时在这一个锁上创建两个condition监视器con1和con2,如果操作con1.signalAll(),那么唤醒的是Lock这个锁里全部等待的线程还是只唤醒被con1这个监视器await的线程呢?新人求帮助! 解决方案 我觉得应该是全部等待线程,你自己可以测试一下啊 解决方案二: con1只是唤醒在con1这个对象上的阻塞队列里的对象

ReentrantLock Condition await signal 专题

  Condition的执行方式,是当在线程T1中调用await方法后,线程T1将释放锁,并且将自己阻塞,等待唤醒, 线程T2获取到锁后,开始做事,完毕后,调用Condition的signal方法,唤醒线程T1,在t2执行完unlock后,线程T1恢复执行.  signalAll和signal很像,内部就是将Condition队列里所有的Node都加入到release队列中,仅此而已   代码如下: import org.joda.time.LocalDateTime; import java.

Java并发(三)使用显式的Lock和Condition对象

    在之前的Java并发(一)wait()与notifyAll()一文中的例子中,我们使用了wait()和notifyAll()来模拟了给汽车打蜡和抛光的情景.在JavaSE5中,还提供了java.util.concurrent.locks.Condition对象供我们使用.你可以在Condition上调用await()来挂起一个任务.当外部条件发生变化,意味着某个任务应该继续执行时,你可以通过调用signal()来通知这个任务,或者调用signalAll()来唤醒所有在这个Conditio

myrocks index condition pushdown

title: MySQL · myrocks · myrocks index condition pushdown author: 张远 index condition pushdown Index condition pushdown(ICP)是直到mysql5.6才引入的特性,主要是为了减少通过二级索引查找主键索引的次数.目前ICP相关的文章也比较多,本文主要从源码角度介绍ICP的实现.讨论之前,我们先再温习下. 以下图片来自mariadb 引入ICP之前 引入ICP之后 再来看个例子 CR

MySQL · myrocks · myrocks index condition pushdown

index condition pushdown Index condition pushdown(ICP)是直到mysql5.6才引入的特性,主要是为了减少通过二级索引查找主键索引的次数.目前ICP相关的文章也比较多,本文主要从源码角度介绍ICP的实现.讨论之前,我们先再温习下. 以下图片来自mariadb 引入ICP之前 引入ICP之后 再来看个例子 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(8) DEFAULT NULL,

MySQL · 特性分析 · Index Condition Pushdown (ICP)

前言 上一篇文章 提过,我们在之后的文章中会从 optimizer 的选项出发,系统的介绍 optimizer 的各个变量,包括变量的原理.作用以及源码实现等,然后再进一步的介绍优化器的工作过程(SQL 语句扁平化处理.索引选择.代价计算.多表连接顺序选择以及物理执行等内容),本期我们先看一下众所周知的 ICP,官方文档请参考这里. ICP 测试 首先,咱们来看一下打开 ICP 与关闭 ICP 之间的性能区别,以下是测试过程: 准备数据: create table icp(id int, age