wait notify原理

黑马视频讲解:https://www.bilibili.com/video/BV16J411h7Rd?p=89

wait notify 原理

在这里插入图片描述

  • owner线程发现条件不满足,调用wait方法,既会进入Monitor锁中的WaiSet集合中变为WAITING状态
  • BLOCKED和WAITING的线程都处于线程阻塞状态,不占用时间片。
  • BLOCKED中的线程会在Owner中的线程释放锁时被唤醒并且非公平的去竞争锁。
  • WAITING状态的线程会在Owenr中的线程调用notify或者notifyAll时唤醒,但被唤醒后并不会马上获得锁而是进入EntryList中重新竞争。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`wait()` 和 `notify()` 方法是 Java 中用于线程间通信的两个重要方法。`wait()` 方法用于让线程进入等待状态,并释放锁,而 `notify()` 方法则用于唤醒等待状态的线程。这两个方法必须在同步方法或同步块中使用,否则会抛出 `IllegalMonitorStateException` 异常。 `wait()` 方法的调用会让线程进入等待状态,直到有其他线程调用了同一个对象的 `notify()` 或 `notifyAll()` 方法来唤醒它。在等待期间,线程会释放它持有的锁,以便其他线程可以进入同步块执行。`wait()` 方法可以使用以下两种方式调用: - `wait()`:让线程一直等待,直到其他线程调用了 `notify()` 或 `notifyAll()` 方法唤醒它。 - `wait(long timeout)`:让线程等待一段时间,如果在等待期间没有其他线程调用 `notify()` 或 `notifyAll()` 方法唤醒它,那么线程会自动醒来。 `notify()` 方法用于唤醒等待状态的线程。它会随机地唤醒一个等待状态的线程,如果有多个线程都在等待同一个对象的锁,那么只有其中一个线程会被唤醒。`notifyAll()` 方法则会唤醒所有等待状态的线程。 以下是一个简单的示例,展示了如何使用 `wait()` 和 `notify()` 方法进行线程间通信: ```java class MyThread implements Runnable { private final Object lock; public MyThread(Object lock) { this.lock = lock; } @Override public void run() { synchronized (lock) { System.out.println("Thread " + Thread.currentThread().getName() + " is waiting"); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread " + Thread.currentThread().getName() + " is awake"); } } } public class Main { public static void main(String[] args) throws InterruptedException { Object lock = new Object(); Thread t1 = new Thread(new MyThread(lock)); Thread t2 = new Thread(new MyThread(lock)); t1.start(); t2.start(); Thread.sleep(1000); synchronized (lock) { lock.notify(); } } } ``` 在这个示例中,我们创建了两个线程 `t1` 和 `t2`,它们都在同一个对象 `lock` 上等待。在主线程中,我们等待 1 秒钟后调用了 `notify()` 方法来唤醒一个等待状态的线程。由于 `notify()` 方法是随机唤醒一个线程,因此我们无法确定哪个线程会被唤醒。在这个示例中,我们可以看到其中一个线程被唤醒并输出了 "Thread X is awake" 的信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值