java中await方法和wait方法区别

news2024/11/14 18:59:27

java中await方法和wait方法区别

在 Java 中,await方法和wait方法存在于不同的类中,并且有着不同的功能和使用场景,以下是它们的详细区别:

所属类及相关机制

await方法

 

  • 所属类:在 Java 的并发编程中,await方法主要出现在与锁相关的条件(Condition)对象上。例如,在使用ReentrantLock可重入锁时,可以通过lock.newCondition()获取一个Condition对象,然后在特定的条件满足前,线程可以调用该Condition对象的await方法进行等待。

  • 相关机制:当线程调用await方法时,它会释放当前持有的锁(与该Condition对象关联的锁,通常是通过ReentrantLock获取的锁),然后进入等待状态,直到被其他线程通过调用同一Condition对象的notifynotifyAll方法唤醒,或者等待超时(如果设置了超时时间)。被唤醒后,线程需要重新获取锁才能继续执行后续操作。

wait方法

 

  • 所属类wait方法属于Object类,这意味着 Java 中的任何对象都可以调用这个方法。但它通常在多线程环境下,用于实现线程间的同步和通信,特别是在对象的锁机制相关场景中使用。

  • 相关机制:当一个线程调用一个对象的wait方法时,它必须先获取该对象的内置锁(也就是通过synchronized关键字修饰的方法或代码块所关联的锁)。调用wait方法后,线程会释放该对象的内置锁,进入等待状态,直到被其他线程通过调用同一对象的notifynotifyAll方法唤醒,或者等待超时(如果设置了超时时间)。被唤醒后,线程需要重新获取该对象的内置锁才能继续执行后续操作。

锁处理方式

await方法

 

  • 在调用await方法前,线程必须已经获取了与Condition对象关联的锁(如ReentrantLock)。调用await时,会主动释放该锁,使得其他线程有机会获取锁并执行相关操作,这有助于避免死锁情况的发生,因为在等待条件满足的过程中,锁资源可以被其他线程合理利用。

wait方法

 

  • 线程在调用wait方法之前,需要先获取对象的内置锁(通过synchronized修饰的方法或代码块获取)。调用wait后,同样会释放该对象的内置锁,但这里的锁是对象级别的内置锁,与await方法中与Condition对象关联的锁(如ReentrantLock)不同。

唤醒机制

await方法

 

  • 线程调用await方法进入等待状态后,需要通过同一Condition对象的notifynotifyAll方法来唤醒。例如,在一个生产者 - 消费者模型中,生产者在满足一定条件(如缓冲区已满)时可以调用Condition对象的notifynotifyAll方法来唤醒正在等待的消费者线程。

wait方法

 

  • 线程调用wait方法进入等待状态后,需要通过同一对象的notifynotifyAll方法来唤醒。也就是说,如果一个线程对某个对象调用了wait方法进入等待,那么其他线程必须对同一对象调用notifynotifyAll方法才能将其唤醒。例如,在一个简单的线程同步场景中,线程 A 对一个共享对象调用了wait方法进入等待,那么线程 B 如果要唤醒线程 A,就必须对同一个共享对象调用notifynotifyAll方法。

适用场景

await方法

 

  • 更适用于基于ReentrantLock等显式锁以及与之关联的Condition对象构建的复杂多线程同步场景,比如在实现生产者 - 消费者模型、读写锁模型等需要精确控制条件等待和唤醒的场景中,通过Condition对象的awaitnotifynotifyAll方法可以实现更加灵活和精细的线程间协作和同步。

wait方法

 

  • 适用于基于对象的内置锁(通过synchronized关键字修饰的方法或代码块获取)的简单多线程同步场景,例如在一些基本的共享资源访问控制、简单的线程协作等场景中,通过对象的waitnotifynotifyAll方法可以实现基本的线程间同步和通信。

 

综上所述,在 Java 中,await方法和wait方法虽然都用于实现线程间的等待和唤醒功能,但它们在所属类、锁处理方式、唤醒机制以及适用场景等方面存在明显区别,在实际的多线程编程中需要根据具体的需求和场景选择合适的方法来实现线程间的同步和通信。

在 Java 中,await方法主要存在于与锁相关的Condition对象上,调用前需获取关联锁(如ReentrantLock),调用时释放锁进入等待,由同一Condition对象的notifynotifyAll唤醒;wait方法属于Object类,调用前要先获取对象内置锁(通过synchronized修饰获取),调用后释放该内置锁等待,由同一对象的notifynotifyAll唤醒。二者在锁处理、唤醒机制、适用场景等方面存在明显区别,编程时需按需选用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes-ArgoCD篇-01-简介

1、什么是Argo CD Argo CD 是针对 Kubernetes 的声明式 GitOps 持续交付工具。 Argo CD官方文档地址:https://argo-cd.readthedocs.io Argo CD源码地址:https://github.com/argoproj/argo-cd 1.1 关于Argo Argo是一个开源的项目,主要是扩…

【Python】轻松实现机器翻译:Transformers库使用教程

轻松实现机器翻译:Transformers库使用教程 近年来,机器翻译技术飞速发展,从传统的基于规则的翻译到统计机器翻译,再到如今流行的神经网络翻译模型,尤其是基于Transformer架构的模型,翻译效果已经有了质的飞…

父子线程间传值问题以及在子线程或者异步情况下使用RequestContextHolder.getRequestAttributes()的注意事项和解决办法

用到的工具类: Slf4j Configuration Lazy(false) public class SpringContextUtil{public static HttpServletRequest getRequest() {ServletRequestAttributes servletRequestAttributes (ServletRequestAttributes) RequestContextHolder.getRequestAttributes()…

FRTC8563实时时钟芯片的作用

FRTC8563是NYFEA徕飞公司推出的一款实时时钟芯片,采用SOP-8封装形式。这种封装形式具有体积小、引脚间距小、便于集成等特点,使得FRTC8563能够方便地应用于各种电子设备中,如:安防摄像机、监控摄像机、行车记录仪、车载电子等。 F…

怎么样绑定域名到AWS(亚马逊云)服务器

1,拿着你买的域名去亚马逊申请一个证书。申请证书分两种,一种是去亚马逊后台填域名手动申请 ,另一种是通过API来申请,类似如下代码: 2、证验证书。有两种方式:一种是通过邮件,另一种去到域名提供…

从0开始深度学习(28)——序列模型

序列模型是指一类特别设计来处理序列数据的神经网络模型。序列数据指的是数据中的每个元素都有先后顺序,比如时间序列数据(股票价格、天气变化等)、自然语言文本(句子中的单词顺序)、语音信号等。 1 统计工具 前面介绍…

边缘计算在工业互联网中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 边缘计算在工业互联网中的应用 边缘计算在工业互联网中的应用 边缘计算在工业互联网中的应用 引言 边缘计算概述 定义与原理 发展…

蓝桥杯——杨辉三角

代码 package day3;public class Demo2 {public static void main(String[] args) {// TODO Auto-generated method stub// for (int i 0; i < 10; i) {// for (int j 0; j < 10; j) {// System.out.print("外&#xff1a;"i"内&#xff1a;&qu…

uniapp中多角色导致tabbar过多的解决方式

由于项目时间较紧张&#xff0c;找了很多却没找到特别合适的方法&#xff0c;最后使用了此方式。 一、自己封装tabbar组件 这里就不介绍怎么封装了&#xff0c;先说一下缺点&#xff1a; 1.跳转会有白屏问题&#xff08;并且搜了好多资料以及查看官网发现没有特别合适的方法…

【JVM】关于JVM的内部原理你到底了解多少(八股文面经知识点)

前言 &#x1f31f;&#x1f31f;本期讲解关于HTTPS的重要的加密原理~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

机器学习 ---模型评估、选择与验证(1)

目录 前言 一、为什么要有训练集与测试集 1、为什么要有训练集与测试集 2、如何划分训练集与测试集 二、欠拟合与过拟合 1、什么是欠拟合与欠拟合的原因 2、什么是过拟合与过拟合的原因 一些解决模型过拟合和欠拟合问题的常见方法&#xff1a; 解决过拟合问题&#…

第74期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

SpringBoot(八)使用AES库对字符串进行加密解密

博客的文章详情页面传递参数是使用AES加密过得,如下图所示: 这个AES加密是通用的加密方式,使用同一套算法,前端和后端都可以对加密之后的字符串进行加密解密操作。 目前线上正在使用的是前端javascript进行加密操作,将加密之后的字符串再传递到后端,PHP再进行解密操作。…

JavaScript逆向爬虫教程-------基础篇之JavaScript密码学以及CryptoJS各种常用算法的实现

目录 一、密码学介绍 1.1 为什么要学密码学?1.2 密码学里面学哪一些 二、字符编码三、位运算四、Hex 编码与 Base64 编码 4.1 Hex 编码4.2 Base64 编码 五、消息摘要算法 5.1 简介5.2 JS中的MD5、SHA、HMAC、SM3 六、对称加密算法 6.1 介绍6.2 加密模式和填充方式6.3 CryptoJ…

《实时流计算系统设计与实现》-Part 2-笔记

做不到实时 做不到实时的原因 实时计算很难。通过增量计算的方式来间接获得问题的&#xff08;伪&#xff09;实时结果&#xff0c;即使这些结果带有迟滞性和近似性&#xff0c;但只要能够带来尽可能最新的信息&#xff0c;那也是有价值的。 原因可分成3个方面&#xff1a; …

gdb调试redis。sudo

1.先启动redis-server和一个redis-cli。 2.ps -aux|grep reids查看redis相关进程。 3.开始以管理员模式附加进程调试sudo gdb -p 2968.注意这里不能不加sudo&#xff0c;因为Redis 可能以 root 用户启动&#xff0c;普通用户无法附加到该进程。否则就会出现可能下列情形&#…

长连接配置以及断线重连

目录 长连接index 主要进行连接 import SockJS from "sockjs-client"; import Stomp from "stompjs"; import { notification } from "antd"; // 网络请求API import { nowApiAddressObj } from "../api/nowApiAddressObj";// 工具 i…

LeetCode【0054】螺旋矩阵

本文目录 1 中文题目2 求解方法&#xff1a;数学模拟2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例&#xff1a; 提示&#xff1a; 1 ≤ m …

万字长文解读深度学习——训练(DeepSpeed、Accelerate)、优化(蒸馏、剪枝、量化)、部署细节

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总万字长文解读…

C#版使用融合通信API发送手机短信息

目录 功能实现 范例运行环境 实现范例 类设计 类代码实现 调用范例 总结 功能实现 融合云通信服务平台&#xff0c;为企业提供全方位通信服务&#xff0c;发送手机短信是其一项核心功能&#xff0c;本文将讲述如何使用融合云服务API为终端手机用户发送短信信息&#xf…