在Java中,多线程的等待唤醒机制是一种非常重要的同步机制,它可以让线程之间相互协作,确保多个线程能够正确地共享资源,避免数据不一致和线程冲突等问题。 等待唤醒机制主要
在Java中,多线程的等待唤醒机制是一种非常重要的同步机制,它可以让线程之间相互协作,确保多个线程能够正确地共享资源,避免数据不一致和线程冲突等问题。
等待唤醒机制主要包括两个操作:等待(wait)和唤醒(notify)。在Java中,这两个操作都是由Object类提供的,因此任何Java对象都支持等待唤醒机制。
一、等待操作
等待操作是通过调用对象的wait()方法实现的。当一个线程调用对象的wait()方法时,该线程会被放入到对象的等待集中,并释放对象的锁。其他线程可以获取对象的锁并执行相关操作。
在调用wait()方法时,必须先获取对象的锁。否则,会抛出IllegalMonitorStateException异常。通常,在调用wait()方法之前,需要先通过synchronized块或方法来获取对象的锁。
二、唤醒操作
唤醒操作是通过调用对象的notify()方法或notifyAll()方法实现的。当一个线程调用对象的notify()方法时,会从对象的等待集中选择一个线程唤醒,让其获取对象的锁并执行相关操作。如果调用notifyAll()方法,则会将对象等待集中的所有线程都唤醒。
同样地,在调用notify()或notifyAll()方法之前,也需要先获取对象的锁。否则,会抛出IllegalMonitorStateException异常。
三、示例代码
演示:
public class WaitWakeExample {
private Object lock = new Object();
private int count = 0;
public void incrementCount() {
synchronized (lock) {
while (count == 5) {
try {
// 等待唤醒
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++;
System.out.println("Count: " + count);
// 唤醒其他线程
lock.notifyAll();
}
}
public void decrementCount() {
synchronized (lock) {
while (count > 0) {
try {
// 等待唤醒
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--;
System.out.println("Count: " + count);
// 唤醒其他线程
lock.notifyAll();
}
}
}
incrementCount()和decrementCount()这两个方法都会先检查count的值,如果count不满足条件,就会调用wait()方法进入等待状态。当count满足条件时,就会调用notifyAll()方法唤醒所有等待的线程。这样就可以保证多个线程能够正确地共享count变量,避免数据不一致和线程冲突等问题。