1 概述

我们知道针对synchronized关键字实现的加锁操作操作我们可以使用wait和notify来实现线程的等待和唤醒线程,但是我们清楚这个时候就只能有一个线程进入等待,那么如果我们想要多个线程等待,同时我们可以唤醒多个线程怎么办呢?这个时候就需要用到Lock对应的Condition来完成了。

我们知道针对Lock与synchronized的区别在于,Lock的操作更加灵活,并且可以响应超时等待和中断。我们下面就来看一看Contidion具体是如何使用的。

2 示例

/*** 演示Condition的使用* @author: LIUTAO* @Date: Created in 2018/9/3  10:12* @Modified By:*/
public class ConditionDemo {public static void main(String[] args) {ReentrantLock reentrantLock = new ReentrantLock();Condition condition = reentrantLock.newCondition();new Thread(() -> {reentrantLock.lock();System.out.println(Thread.currentThread().getName()+"get lock successfully");System.out.println(Thread.currentThread().getName()+"waiting signal");try {condition.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+" get signal successfully");reentrantLock.unlock();},"first thread ").start();new Thread(() -> {reentrantLock.lock();System.out.println(Thread.currentThread().getName()+"get lock successfully");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"send signal");condition.signalAll();System.out.println(Thread.currentThread().getName()+" get signal successfully");reentrantLock.unlock();},"second thread ").start();}
}

运行上面的代码,我们可以看见如下输出:

first thread get lock successfully
first thread waiting signal
second thread get lock successfully
second thread send signal
second thread  get signal successfully
first thread  get signal successfully

我们可以看出在first thread调用了condition.await()后,first thread让出了锁,然后second thread 获取到锁。而当second thread调用condition.signalAll()的时候又让出了锁,first thread获取到锁。这就实现了线程的等待和唤醒。

我们需要注意的是Condition的使用必须在lock()和unlock()方法之间。

3 函数说明

这里我们针对Condition具有的函数进行一个简单的介绍。

await():使当前线程等待,同时释放当前锁,当其他线程中使用signal()时或者signalAll()方法时,线程会重新获得锁并继续执行。或者当线程被中断时,也能跳出等待。该方法和Object的wait()类似。

awaitUninterruptibly():该方法和await()相同,但是不响应中断。

await(long time, TimeUnit unit):当前线程等待,直到线程被唤醒或者中断,或者等待时间耗尽,这里第二个参数就是等待时间单位。

awaitNanos(long nanosTimeout):当前线程等待,直到线程被唤醒或者中断,或者等待时间耗尽,等待的时间单位是固定的为纳秒(十亿分之一秒)。

awaitUntil(Date deadline):前线程等待,直到线程被唤醒或者中断,或者到达具体的截至日期。

signal():唤醒一个等待的线程。

signalAll():唤醒所有等待的线程。

4 和Object的wait()与notify()的区别

(1)Object的一个对象只能又一个等待队列,而针对Lock,一个对象可以有多个等待等待队列。

(2)使用Lock比使用Object加锁的方式具有更好的灵活性。可以响应中断和设置获取锁的超时间。

(3)Lock支持公平性和非公平性的设置,而synchronized不支持。

以上就是针对Condition使用的详解,下面的文章我们将继续学习Condition源码的实现。

JUC--Condition简介和使用相关推荐

  1. JUC.Condition学习笔记[附详细源码解析]

    JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...

  2. 【多线程】java 并发编程中的Condition对象-指定唤醒某个线程

    1.概述 转载:java高并发系列 - 第13天:JUC中的Condition对象 synchronized中实现线程等待和唤醒 Condition简介及常用方法介绍及相关示例 使用Condition ...

  3. Java并发编程,Condition的await和signal等待通知机制

    Condition简介 Object类是Java中所有类的父类, 在线程间实现通信的往往会应用到Object的几个方法: wait(),wait(long timeout),wait(long tim ...

  4. 浅析Condition与等待通知机制

    Condition是在java 1.5中才出现的,它用来替代传统的Object的wait().notify()实现线程间的协作,相比使用Object的wait().notify(),使用Conditi ...

  5. 爬梯:JUC并发编程(一)

    学习资源整理自:B站<狂神说> JUC并发编程 1.基础概念 JUC 就是 java.util.concurrent java到底能否自己开启线程? 答案是否定的,在创建线程的底层,使用的 ...

  6. Java锁——Condition使用示例及讲解

    Condition简介 任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long ...

  7. Condition和 AQS 原理

    Condition简介 任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long ...

  8. Java中的Condition详解

    一.Condition简介 任意一个Java对象,都拥有一组监视器方法(定义在Object类中),主要包括wait,notify,notifyAll方法,这些方法与synchornized关键字相配合 ...

  9. 我画了35张图就是为了让你深入 AQS

    来自:程序员cxuan 前言 谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的Reen ...

  10. 我画了35张图,就是为了让你深入理解 AQS

    前言 谈到并发,我们不得不说AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock.Re ...

最新文章

  1. 【UWB】ELM 极限学习机原理及公式推导
  2. 这家AI公司用面具破解中国人脸识别系统!微信、支付宝、火车站无一幸免
  3. 4.4.2 数值处理
  4. java的弱索引是什么_Java从零开始学 - 第76篇:什么是索引?
  5. QTableView结构及用法
  6. 景格虚拟教具混合动力汽车动力系统虚拟结构原理展示台复制狗
  7. 正则表达式 正则表达式语法
  8. R 语言计算卡方检验的P值
  9. 以太坊网络重启并开启rpc
  10. nohup java -jar 命令启动jar包,项目仍然会莫名其妙挂掉的解决方法
  11. ESP32_学习笔记(一)NVS的操作(存储和读取大数组)(为什么存入数据成功,读取却为零的原因)
  12. 爬虫攻守道 - 2023最新 - Python Selenium 实现 - 数据去伪存真,正则表达式谁与争锋 - 爬取某天气网站历史数据
  13. 干货 :7招帮你打造完美数据科学GitHub作品集!
  14. 微服务架构最重要的 10 个设计模式!
  15. 21款超赞的手写英文字体,总有一款适合你
  16. Iphone X黑科技大揭秘,这几大摄像功能是要上天!
  17. 无人驾驶技术入门(四)| 百度无人车传感器 IMU 深入剖析
  18. 艾默生Micromotion质量流量计的应用总结
  19. 劈尖干涉公式_劈尖干涉条纹间距的推导及应用
  20. 移动办公邮箱app,怎么设置邮件归档?

热门文章

  1. 【zeppelin 输出限制】ZEPPELIN_INTERPRETER_OUTPUT_LIMIT
  2. 中山黄埔有没有学计算机学校,在广东中山黄埔的技校,女生是蓝色的校服的,那学校叫什么名字,还有就是那学校有什么可以学?...
  3. matlab conv2 和filter2的区别
  4. Android 获取App可用内存
  5. 电话销售话术 转
  6. namp 扫描器之王的基本使用
  7. ttylinux的安装部署
  8. 中职计算机基础必考知识,中职计算机基础知识整理 简化
  9. 华为机试真题分类汇总
  10. 【转】SAP为企业数字化转型赋能