多线程中的wait和notify方法
2024-01-08 17:20:03
多线程中的通信与同步
在多线程编程中,线程之间的通信和同步至关重要。线程通信是指线程之间交换数据或信息,而线程同步是指控制线程的执行顺序,以确保共享资源的安全访问。Java 中提供了多种机制来实现线程通信和同步,其中 wait 和 notify 方法就是其中之一。
wait 方法
wait 方法是 Object 类的一个方法,它允许一个线程在某个条件不满足时暂时挂起,直到其他线程调用 notify 或 notifyAll 方法唤醒它。当一个线程调用 wait 方法时,它会释放它持有的锁,并进入等待状态。直到其他线程调用 notify 或 notifyAll 方法唤醒它,它才会重新获得锁并继续执行。
notify 方法
notify 方法也是 Object 类的一个方法,它用于唤醒一个正在等待的线程。当一个线程调用 notify 方法时,它会随机选择一个正在等待的线程并唤醒它。被唤醒的线程会重新获得锁并继续执行。
notifyAll 方法
notifyAll 方法与 notify 方法类似,但它会唤醒所有正在等待的线程。当一个线程调用 notifyAll 方法时,所有正在等待的线程都会重新获得锁并继续执行。
使用 wait 和 notify 实现线程通信和同步
为了更好地理解 wait 和 notify 方法的实际应用,我们来看一个示例。假设我们有一个银行账户类 BankAccount,它包含一个余额属性 balance 和一个取款方法 withdraw。我们希望通过多线程来实现对银行账户的并发访问,并确保取款操作是安全的。
public class BankAccount {
private double balance;
public BankAccount(double balance) {
this.balance = balance;
}
public synchronized void withdraw(double amount) throws InterruptedException {
while (balance < amount) {
wait();
}
balance -= amount;
notifyAll();
}
public synchronized void deposit(double amount) {
balance += amount;
notifyAll();
}
}
在这个示例中,withdraw 方法使用 wait 方法来挂起线程,直到账户余额足够支付取款金额。deposit 方法使用 notifyAll 方法来唤醒所有正在等待的线程,以确保其他线程可以继续执行。
总结
wait 和 notify 方法是 Java 多线程编程中非常重要的两个方法,它们可以实现线程之间的通信和同步。通过合理使用这两个方法,我们可以编写出高效且安全的并发程序。