目录

1:概述

2:举例

3:condition 的一些方法


1:概述

Condition本质上是一个接口,Condition因素与Object监视器方法( wait , notify和notifyAll )成不同的对象,以得到具有多个等待集的每个对象,通过将它们与使用任意的组合的效果Lock个实现。 Lock替换synchronized方法和语句的使用, Condition取代了对象监视器方法的使用。

条件(也称为条件队列或条件变量 )为一个线程暂停执行(“等待”)提供了一种方法,直到另一个线程通知某些状态现在可能为真。 因为访问此共享状态信息发生在不同的线程中,所以它必须被保护,因此某种形式的锁与该条件相关联。 等待条件的关键属性是它原子地释放相关的锁并挂起当前线程,就像Object.wait 。

一个Condition实例本质上绑定到一个锁。 要获得特定Condition实例的Condition实例,请使用其newCondition()方法。

2:举例

例1:

假设我们有一个有限的缓冲区,它支持put和take方法。 如果在一个空的缓冲区尝试一个take ,则线程将阻塞直到一个项目可用; 如果put试图在一个完整的缓冲区,那么线程将阻塞,直到空间变得可用。 我们希望在单独的等待集中等待put线程和take线程,以便我们可以在缓冲区中的项目或空间可用的时候使用仅通知单个线程的优化。 这可以使用两个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(); }}} 

例子2:

假设我们要求3个线程,第一个打印A,第二个线程打印b ,第三个线程打印c,要求按照顺序执行

package com.example.juc.sale;import com.sun.corba.se.impl.orbutil.threadpool.WorkQueueImpl;
import com.sun.corba.se.spi.orbutil.threadpool.WorkQueue;import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @Author * @Date Created in  2023/6/14 16:43* @DESCRIPTION:* @Version V1.0*/public class demo3 {public static void main(String[] args) {Test2 test2 = new Test2();new Thread(()->{test2.printA();},"A").start();new Thread(()->{test2.printB();},"B").start();new Thread(()->{test2.printC();},"C").start();}static class Test2{private Lock lock = new ReentrantLock();private Condition condition1 = lock.newCondition();private Condition condition2 = lock.newCondition();private Condition condition3 = lock.newCondition();private int number = 1;public void printA() {lock.lock();try {//业务,判断->执行->通知while (number != 1) {//等待condition1.await();}System.out.println(Thread.currentThread().getName() + "--->A");//唤醒指定的人:Bnumber = 2;condition2.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void printB() {lock.lock();try {//业务,判断->执行->通知while (number != 2) {//等待condition2.await();}System.out.println(Thread.currentThread().getName() + "--->b");//唤醒指定的人:Bnumber = 3;condition3.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}public void printC() {lock.lock();try {//业务,判断->执行->通知while (number != 3) {//等待condition3.await();}System.out.println(Thread.currentThread().getName() + "--->c");//唤醒指定的人:Bnumber = 3;condition1.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}
}

3:condition 的一些方法

  • void await()

    导致当前线程等到发信号或 interrupted 。

    boolean await(long time, TimeUnit unit)

    使当前线程等待直到发出信号或中断,或指定的等待时间过去。

    long awaitNanos(long nanosTimeout)

    使当前线程等待直到发出信号或中断,或指定的等待时间过去。

    void awaitUninterruptibly()

    使当前线程等待直到发出信号。

    boolean awaitUntil(Date deadline)

    使当前线程等待直到发出信号或中断,或者指定的最后期限过去。

    void signal()

    唤醒一个等待线程。

    void signalAll()

    唤醒所有等待线程

JUC并发编程:Condition的简单理解与使用相关推荐

  1. 基于《狂神说Java》JUC并发编程--学习笔记

    前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...

  2. Java JUC并发编程详解

    Java JUC并发编程详解 1. JUC概述 1.1 JUC简介 1.2 进程与线程 1.2 并发与并行 1.3 用户线程和守护线程 2. Lock接口 2.1 Synchronized 2.2 什 ...

  3. 多线程进阶=》JUC并发编程

    多线程进阶=>JUC并发编程 1.什么是JUC ​ JUC是java.util.concurrent的简写. ​ 用中文概括一下,JUC的意思就是java并发编程工具包. ​ 并发编程的本质就是 ...

  4. ❤️《JUC并发编程从入门到高级》(建议收藏)❤️

    JUC并发编程 1.什么是JUC JUC的意思就是java并发编程工具包,与JUC相关的有三个包:java.util.concurrent.java.util.concurrent.atomic.ja ...

  5. 多线程进阶=》JUC并发编程02

    在JUC并发编程01中说到了,什么是JUC.线程和进程.Lock锁.生产者和消费者问题.8锁现象.集合类不安全.Callable(简单).常用辅助类.读写锁 https://blog.csdn.net ...

  6. JUC并发编程(java util concurrent)(哔站 狂神说java juc并发编程 摘录笔记)

    JUC并发编程(java util concurrent) 1.什么是JUC JUC并不是一个很神秘的东西(就是 java.util 工具包.包.分类) 业务:普通的线程代码 Thread Runna ...

  7. JUC并发编程小总结

    JUC是Java编发编程中使用的工具类,全称为java.util.concurrent.近期在大厂面试中屡屡被问到关于JUC的相关知识点问题,其重要性不言而喻,学好用好JUC可以说是每一个Java程序 ...

  8. 爬梯:JUC并发编程(三)

    学习资源整理自:B站<狂神说> 书接上回 JUC并发编程 12.CompletableFuture 异步回调 理解 父类:Future,对将来的某个事件的结果进行建模 可以用ajax进行理 ...

  9. AQS理解之五—并发编程中AQS的理解

    AQS理解之五-并发编程中AQS的理解 首先看下uml类图: AbstractOwnableSynchronizer 这个类定义是提供一个创建锁的基础,设置一个排它线程,帮助控制和监控访问. 先看下A ...

  10. JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快!

    JUC并发编程第十四篇,StampedLock(邮戳锁)为什么比ReentrantReadWriteLock(读写锁)更快! 一.ReentrantReadWriteLock(读写锁) 1.读写锁存在 ...

最新文章

  1. CVPR 2021| 端到端场景无关视觉定位算法(SuperGlue一作出品)
  2. SQLServer代理新建或者编辑作业报错
  3. Direct 3D学习笔记(三)——光照与材质
  4. ft232h引脚_一种基于芯片ft232h的usb接口电路的制作方法
  5. QT生成可执行的EXE程序
  6. 44个基于SaaS的商业智能解决方案
  7. python实现梳排序
  8. Python 十进制转换二进制
  9. 韩信点兵python源代码_Python实现“韩信点兵”
  10. Python爬虫进阶之字体反扒保姆级教程!
  11. [ukulele]入门指南
  12. 极客日报第 40 期:小米 11 发布,售价 3999 元起;罗永浩回应败诉半导体公司
  13. scrum立会报告+燃尽图(第二周第三次)
  14. C语言——字符串+转义字符+注释
  15. C#游戏跨服架构进化之路
  16. 安卓4G/5G无线图传终端(单兵执法记录仪、智能安全帽、头盔摄像头)常见问题
  17. 整理文件夹保存同一目录,并统一重命名文件夹名
  18. ALtera DE2开发板学习
  19. 无人驾驶汽车系统入门(一)——卡尔曼滤波与目标追踪
  20. 新视智科多项技术创新层层把关锂电池质检提升产品质量

热门文章

  1. 程序员应该知道的一些网站
  2. python pandas dropna_Pandas之Dropna滤除缺失数据的实现方法
  3. 使用Amazon SageMaker构建高质量AI作画模型Stable Diffusion
  4. 理解Spring定时任务@Scheduled的两个属性fixedRate和fixedDelay以及固定时间的定时cron
  5. 《精英的傲慢:好的社会该如何定义成功》笔记与摘录二
  6. 企业信用等级评价怎么办理
  7. 树莓派接USB鼠标用不了
  8. element子组件向父组件传值
  9. java上传图片损坏_大神求助 上传图片后 图片损坏
  10. 20个优秀的 Photoshop 网页制作教程