https://www.itheima.com/news/20230628/093710.html
wait()、notify()和notifyAll()是Java中用于线程间通信的方法,它们必须与synchronized关键字一起使用。接下来笔者将详细解释为什么要这样使用。
在Java中,synchronized关键字用于实现线程的互斥访问,即同一时刻只能有一个线程执行被synchronized关键字包裹的代码块或方法。这样可以确保在共享资源上的操作是线程安全的。
wait() 方法用于使当前线程进入等待状态,直到其他线程调用相同对象的 notify() 或 notifyAll() 方法来唤醒它。当一个线程调用 wait() 方法时,它会释放当前持有的锁,允许其他线程进入临界区并执行相关操作。
notify() 方法用于唤醒一个正在等待的线程。如果有多个线程等待,只能唤醒其中一个线程,具体唤醒哪个线程是不确定的。notifyAll()方法则会唤醒所有等待的线程,让它们重新竞争锁。
现在我们来看看为什么wait()、notify()和notifyAll()需要与synchronized一起使用:
wait()、notify()和notifyAll()方法必须在同步块或同步方法中调用,以确保在调用这些方法时,当前线程已经获取了对象的监视器锁(即通过synchronized获取锁),这样才能对锁进行释放或唤醒等操作。
当一个线程调用wait()方法时,它会释放当前持有的监视器锁,让其他线程能够获得该锁并执行相关操作。当调用notify()或notifyAll()方法时,被唤醒的线程会重新竞争获取锁,一旦获取到锁,才能继续执行。