并发编程-线程等待唤醒机制

目录

前言

​编辑

线程等待和唤醒的方法 

wait() 方法:

notify() 方法:

注意事项和建议:

我的其他博客


前言

程等待唤醒机制是多线程编程中用于线程之间协调和通信的一种机制。在多线程环境中,有时候一个线程需要等待某个条件满足,而另一个线程则需要在某个条件满足时通知其他线程。

线程等待和唤醒的方法 

在Java中,线程等待和唤醒的方法通常是通过 Object 类的 wait(), notify(), 和 notifyAll() 方法来实现的。这些方法必须在同步块或同步方法中使用,因为它们依赖于对象的锁机制。

wait() 方法:

  • 使当前线程进入等待状态,同时释放对象的锁。
  • 调用 wait() 后,线程会等待被其他线程通过 notify()notifyAll() 方法唤醒。
  • 在等待期间,线程可以被中断(通过 interrupt() 方法),也可以在等待一定时间后自动唤醒(通过带有超时参数的 wait(long timeout) 方法)。
    synchronized (sharedObject) {
        while (conditionIsNotMet) {
            sharedObject.wait();
        }
        // 执行等待后的操作
    }
    

    notify() 方法:

  • 唤醒在此对象上等待的一个线程。
  • 如果有多个线程在等待,notify() 方法会选择其中一个线程唤醒,但是无法确定是哪一个。
  • 调用 notify() 后,被唤醒的线程将尝试重新获得对象的锁。
    synchronized (sharedObject) {
        // 满足条件后,通知等待的线程
        sharedObject.notify();
    }
    

    notifyAll() 方法:

  • 唤醒在此对象上等待的所有线程。
  • 使用 notifyAll() 会唤醒所有等待的线程,这样它们都有机会争夺对象的锁。
    synchronized (sharedObject) {
        // 满足条件后,通知等待的所有线程
        sharedObject.notifyAll();
    }
    

    在上述代码中,sharedObject 是共享对象,多个线程在这个对象上进行同步。wait() 方法会使线程释放对象的锁,然后等待其他线程唤醒。notify()notifyAll() 方法用于在满足某个条件时通知等待的线程,使其重新竞争锁。

注意事项和建议:

  1. 防止虚假唤醒: 在等待的时候,通常需要在循环中检查条件,以防止虚假唤醒。

    synchronized (sharedObject) {
        while (conditionIsNotMet) {
            sharedObject.wait();
        }
        // 某个条件满足后的操作
    }
    

  2. 调用顺序: 调用 wait() 方法的线程会释放对象的锁,而调用 notify()notifyAll() 的线程会尝试重新获得对象的锁。

  3. 合理使用 notifyAll() 在使用 notifyAll() 时,需要考虑唤醒的线程是否真的需要被唤醒,以避免不必要的性能开销。

  4. 避免死锁: 当设计线程等待唤醒机制时,需要注意避免死锁的情况,确保线程能够正确释放和获取锁。

  5. 示例代码:

    class SharedResource {
        private boolean condition = false;
    
        synchronized void waitForCondition() throws InterruptedException {
            while (!condition) {
                wait();
            }
            // 某个条件满足后的操作
        }
    
        synchronized void signalCondition() {
            condition = true;
            notifyAll();  // 或 notify(),唤醒等待的线程
        }
    }
    

    上述代码中,waitForCondition 方法用于等待条件满足,而 signalCondition 方法用于设置条件并唤醒等待的线程。这是一个简单的示例,实际应用中,需要根据具体场景设计合适的等待唤醒机制。

我的其他博客

简单介绍一些其他的树-CSDN博客

认识二叉树(详细介绍)-CSDN博客

正则表达式详细讲解-CSDN博客

低代码开发:创新之道还是软件开发的捷径?-CSDN博客

HTTP与HTTTPS的区别-CSDN博客

什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查-CSDN博客

在多线程中sleep()和wait()的区别(详细)-CSDN博客

谈谈我对HashMap扩容机制的理解及底层实现-CSDN博客

堆排序详细讲解(一文足矣JAVA)-CSDN博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还在路上的秃头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值