JUC并发编程:Condition的简单理解与使用

简介: JUC并发编程: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,要求按照顺序执行

8ea5b56a9fef4fb1946d9aa5d1974911.png

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

唤醒所有等待线程

目录
相关文章
|
算法 测试技术 定位技术
数据结构与算法——DFS(深度优先搜索)
数据结构与算法——DFS(深度优先搜索)
|
7月前
|
编解码 API Python
拼多多按图搜索商品API技术实践指南
拼多多图片搜索API简介:通过POST请求,传入Base64或URL图片,支持商品以图搜货。需用client_id/client_secret鉴权及MD5签名,图片限JPG/PNG、≤500KB、800×600以上。返回商品ID、名称、价格(分)、主图等信息。(239字)
1159 0
|
11月前
|
关系型数据库 MySQL BI
为什么实时更新场景下 Doris 查询性能是 ClickHouse 的 34 倍
企业数据分析能力从TP系统起步,随业务发展历经扩展优化,最终走向AP系统独立建设。Apache Doris凭借高并发、低延迟、实时更新与强查询性能,成为实时分析架构升级的理想选择,助力网易云音乐、快手、拉卡拉等企业实现性能倍增与成本优化。
771 12
为什么实时更新场景下 Doris 查询性能是 ClickHouse 的 34 倍
|
11月前
|
机器学习/深度学习 JSON 搜索推荐
1688图片搜索API技术文档
1688图片搜索API(拍立淘)是阿里巴巴官方图像搜货工具,支持通过图片URL或Base64编码查找1688平台同款或相似商品。基于深度学习技术,精准匹配商品ID、标题、价格、销量、供应商等全维度信息,命中率超85%,单次响应≤1秒,支持批量调用与分页排序,适用于电商比价、选品采购等场景。
1258 0
|
Linux 数据安全/隐私保护 虚拟化
【赵渝强老师】Docker的私有镜像仓库:Harbor
Harbor是由VMware开发的企业级Docker镜像仓库管理工具,支持权限管理、LDAP集成、日志审计、镜像复制及中文界面等功能。本文详细介绍了Harbor的安装、配置及在Docker中的实战应用流程,涵盖环境准备、部署步骤、基础操作和镜像上传等内容,适用于容器化应用的镜像管理场景。
1232 4
|
Java
《Java工程师成神之路》电子版
《Java工程师成神之路(基础篇)》介绍了普通Java工程师必须要学习的相关知识点,包括面向对象和Java语言基础两大部分,涵盖基本数据类型、关键字、异常、I/O流、集合、反射、泛型和枚举......
1184 0
 《Java工程师成神之路》电子版
|
机器学习/深度学习 JSON API
淘宝图片搜索接口(Taobao.item_search_img)
淘宝图片搜索接口(Taobao.item_search_img)允许开发者通过上传商品图片或提供图片地址,获取相似的淘宝商品列表。该接口基于深度学习和计算机视觉技术,支持注册账号、申请权限、构造请求参数、调用接口、解析响应数据等步骤。适用于电商平台购物体验提升、商家商品优化与推广、商品推荐系统和图片版权保护等场景。
1917 4
|
人工智能 缓存 前端开发
通过API接口实现1688图片搜索商品功能全攻略
本文详细介绍如何通过API接口实现1688图片搜索商品功能,并对接至自有系统。核心流程包括:用户上传图片后,利用百度AI图像识别API提取特征并生成关键词,再调用1688开放平台的商品搜索接口获取结果。技术方案采用Python开发,涵盖前端交互设计与后端集成要点,如接口服务化、缓存机制及异常处理。此外,文章还提供了性能优化建议和数据解析示例,适用于电商平台及多种扩展场景。
|
Java API 网络架构
Gateway的配置与使用
通过以上步骤,你可以配置和使用Spring Cloud Gateway来实现微服务架构中的请求路由和过滤功能。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
689 5
|
文字识别 前端开发 API
印刷文字识别操作报错合集之通过HTTPS连接到OCR服务的API时报错,该如何处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。