当前位置: 首页 > news >正文

Java面试题:解释线程间如何通过wait、notify和notifyAll方法进行通信

在 Java 中,线程间的通信可以通过 wait()notify()notifyAll() 这三个方法实现。这些方法是 Java 线程 Thread 类的一部分,它们与 synchronized 关键字一起使用,以实现线程间的协调。

基本概念

  • wait():当一个线程执行到 wait() 方法时,它会释放它持有的所有锁,并进入等待状态。直到其他线程调用相同对象的 notify()notifyAll() 方法,它才会被唤醒。
  • notify():唤醒在此对象监视器上等待的单个线程。选择哪个线程被唤醒是不确定的。
  • notifyAll():唤醒在此对象监视器上等待的所有线程。

工作机制

  1. 加锁:在调用 wait()notify()notifyAll() 之前,必须先通过 synchronized 关键字获取对象的锁。
  2. 等待:当线程调用 wait() 时,它会释放锁并进入等待状态,直到被其他线程唤醒。
  3. 唤醒:当其他线程调用 notify()notifyAll() 时,它会唤醒一个或所有等待的线程。
  4. 重新竞争锁:被唤醒的线程需要重新竞争获取对象的锁,才能继续执行。

使用场景

  • 当一个线程需要等待某个条件成立时,可以使用 wait() 方法。
  • 当条件成立时,其他线程可以通过 notify()notifyAll() 唤醒等待的线程。

示例

假设有两个线程,一个生产者和一个消费者:

public class SharedObject {private boolean available = false;public synchronized void waitForSignal() throws InterruptedException {while (!available) {wait(); // 等待信号}}public synchronized void sendSignal() {available = true;notify(); // 发送信号}
}

在这个例子中,waitForSignal() 方法中的 wait() 会阻塞,直到 sendSignal() 方法中的 notify() 被调用。

注意事项

  • 必须在 synchronized 块或方法中调用 wait()notify()notifyAll()
  • 调用 wait() 时,线程会释放锁,调用结束后,线程会重新尝试获取锁。
  • 使用 notify() 时,只有一个等待的线程会被唤醒,而 notifyAll() 会唤醒所有等待的线程。
  • 为了避免死锁,通常推荐使用 java.util.concurrent 包中的 Lock 接口和相关实现,因为它们提供了更灵活的锁操作。

通过合理使用 wait()notify()notifyAll() 方法,线程可以在需要时等待,条件满足时被唤醒,从而实现线程间的有效通信。

http://www.lryc.cn/news/380011.html

相关文章:

  • 【机器学习 复习】第9章 降维算法——PCA降维
  • Ubuntu系统docker gpu环境搭建
  • 网络安全-如何设计一个安全的API(安全角度)
  • 微积分-导数1(导数与变化率)
  • 最新PHP仿猪八戒任务威客网整站源码/在线接任务网站源码
  • Windows安装配置jdk和maven
  • 电子SOP实施(MQTT协议)
  • 【Unity导航系统】Navigation组件的概念及其使用示例
  • vue-cli 根据文字生成pdf格式文件 jsPDF
  • 【嵌入式DIY实例】-Nokia 5110显示DS3231 RTC数据
  • 【十三】图解mybatis缓存模块之装饰器模式
  • 字节大神强推千页PDF学习笔记,弱化学历问题,已拿意向书字节提前批移动端!
  • Python爬虫-贝壳二手房“改进版”
  • zookeeper学习、配置文件参数详解
  • SVG 模糊效果
  • Electron+vite+vuetify项目搭建
  • 洛谷:P1085 [NOIP2004 普及组] 不高兴的津津
  • Webpack4从入门到精通以及和webpack5对比_webpack现在用的是哪个版本
  • 巴鲁夫MacroBuilder2.0.0.0软件巴鲁夫和使用手侧
  • 分享:Javascript开源桌面环境-Puter
  • 【idea-jdk1.8】使用Spring Initializr 创建 Spring Boot项目没有JDK8
  • 647. 回文子串(leetcode)
  • 【车载开发系列】汽车嵌入式开发常用工具介绍
  • python脚本获取本机IP的方式
  • 查看LabVIEW及各个模块和驱动的版本号
  • LLM主流架构和模型
  • 为企业提供动力:用于大型组织的WordPress
  • Django框架数据库ORM查询操作
  • font-spider按需生成字体文件
  • 双叒叕-一个-Android-MVVM-组件化架构框架?