Java多线程:等待、通知、调度与死锁解析
1. 线程间通信:wait、notifyAll和notify方法
在多线程编程中,同步锁机制能防止线程间的相互干扰,但还需要一种线程间的通信方式。 wait
、 notifyAll
和 notify
方法就提供了这样的通信机制,它们都定义在 Object
类中,所有类都可以继承使用。
1.1 等待线程的标准模式
等待某个条件的线程通常会采用以下模式:
synchronized void doWhenCondition() {
while (!condition)
wait();
… Do what must be done when the condition is true …
}
这种模式有几个要点:
- 同步代码块 :所有操作都在同步代码块中执行,否则对象状态可能不稳定。例如,如果方法未声明为同步, while
语句之后,条件可能不再为真,因为其他线程可能已经改变了条件测试的情况。
- 原子释放锁 : wait
方法暂停线程时,会原子性地释放对象的锁。这意味着线程挂起和锁释放是同时发生的,避免了竞态条件。当线程被通知重新启动时,会原子性地重新获取锁。
- 循环条件测试