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

Java中的wait和notify、Condition接口的使用

Java中的wait和notify机制

基础概念

在Java中,wait()notify()Object类的原生方法,用于实现线程间的协作:

  1. wait()

    • 使当前线程释放对象锁并进入等待状态
    • 必须在synchronized代码块内调用
    • 语法:obj.wait()obj.wait(long timeout)
    • 线程状态变化:RUNNING → WAITING
  2. notify()

    • 随机唤醒一个在该对象上等待的线程
    • notifyAll()唤醒所有等待线程
    • 同样必须在synchronized代码块内调用
// 生产者-消费者示例
class Buffer {private int data;private boolean available = false;public synchronized void produce(int value) {while (available) wait();  // 等待消费者取走数据data = value;available = true;notifyAll();  // 唤醒消费者}public synchronized int consume() {while (!available) wait();  // 等待生产者写入数据available = false;notifyAll();  // 唤醒生产者return data;}
}

执行流程
graph LRA[线程调用wait] --> B[释放对象锁]B --> C[进入等待队列]D[其他线程调用notify] --> E[唤醒等待线程]E --> F[线程尝试重新获取锁]F --> G[获取锁后继续执行]


Condition接口(java.util.concurrent.locks)

核心方法

Condition接口提供了更灵活的线程协调机制,需配合Lock使用:

  1. await()

    • 功能类似wait(),但支持更丰富的等待条件
    • 可响应中断:awaitUninterruptibly()
    • 支持超时:await(long time, TimeUnit unit)
  2. signal()

    • 唤醒单个等待线程(类似notify()
    • signalAll()唤醒所有等待线程
使用示例
import java.util.concurrent.locks.*;class ConditionExample {private final Lock lock = new ReentrantLock();private final Condition notFull = lock.newCondition();private final Condition notEmpty = lock.newCondition();private int[] buffer = new int[10];private int count = 0;public void produce(int item) throws InterruptedException {lock.lock();try {while (count == buffer.length) notFull.await();  // 缓冲区满时等待buffer[count++] = item;notEmpty.signal();   // 唤醒消费者} finally {lock.unlock();}}public int consume() throws InterruptedException {lock.lock();try {while (count == 0) notEmpty.await();  // 缓冲区空时等待int item = buffer[--count];notFull.signal();      // 唤醒生产者return item;} finally {lock.unlock();}}
}


对比分析

特性wait/notifyCondition
锁机制必须配合synchronized必须配合Lock实现
多条件等待不支持支持创建多个Condition实例
中断响应仅基础中断提供awaitUninterruptibly()
超时控制有限支持精确到纳秒的超时控制
公平性依赖synchronized可通过ReentrantLock配置
唤醒精确性notify随机唤醒signal可定向唤醒特定条件队列

最佳实践

  1. 循环检查条件
    始终在循环中检查等待条件,避免虚假唤醒:

    while (!condition) {obj.wait();
    }
    

  2. 资源释放
    使用try-finally确保锁释放:

    lock.lock();
    try {// 临界区代码
    } finally {lock.unlock();
    }
    

  3. 选择建议

    • 简单场景:优先使用synchronized + wait/notify
    • 复杂同步:使用Lock + Condition(如多条件队列、公平锁需求)

注意:Java 5+推荐使用java.util.concurrent包中的高级同步工具(如BlockingQueue),仅在底层控制需要时使用wait/notify或Condition。

http://www.dtcms.com/a/276092.html

相关文章:

  • 分类问题与多层感知机
  • pip国内镜像源一览
  • [es自动化更新] Updatecli编排配置.yaml | dockerfilePath值文件.yml
  • springboot+swagger2文档从swagger-bootstrap-ui更换为knife4j及文档接口参数不显示问题
  • 【高等数学】第三章 微分中值定理与导数的应用——第七节 曲率
  • DirectX Repair修复工具下载,.NET修复,DirectX修复
  • python 中 ‘5‘ 和 5 有什么本质区别?
  • 【深度学习】 1 Deep Learning
  • 12. JVM的垃圾回收器
  • LangChain 代理(Agents)学习
  • 网页五子棋-对战
  • python学习打卡:DAY 37 早停策略和模型权重的保存
  • web网站无法抓包排查;burp无法抓包情况
  • comfyUI-controlNet-线稿软边缘
  • c++中的STL
  • Day59
  • 智能制造——解读50页智能工厂系统集成总体解决方案【附全文阅读】
  • python学习打卡:DAY 40 训练和测试的规范写法
  • 深入详解:决策树在医学影像领域心脏疾病诊断的应用及实现细节
  • 苦练Python第9天:if-else分支九剑
  • 影刀rpa初级选择题答案-02网页自动化-源码-初级证书
  • 6. JVM直接内存
  • 菜鸟的C#学习(二)
  • 动手开发 MCP Server (Datawhale AI夏令营)
  • TensorBoard
  • 全栈开发知识
  • 计算机毕业设计springboot阳阳助农电商平台 基于Spring Boot的阳阳助农电商平台设计与开发 Spring Boot框架下的阳阳助农电商平台构建
  • 苦练Python第7天:布尔七日斩
  • 模拟电路--供复习和嵌入式学习
  • 威联通docker容器安装宝塔面板