###
mGlobalLock.wait() 的工作机制
mGlobalLock.wait() 是 Java
Object 类的一个方法,用于线程同步,结合
synchronized 块和
notify()/
notifyAll() 实现线程间的条件等待和唤醒机制。在 Android 的
WindowManagerGlobalLock 上下文中(例如
WindowOrganizerController 或
ActivityTaskManagerService),它作为全局锁的一部分,用于协调窗口管理和活动启动等操作的线程安全。以下是其详细工作机制:
#### 1.
调用前提-
mGlobalLock 是
WindowManagerGlobalLock 类型的对象,充当锁(monitor)。
wait() 必须在
synchronized (mGlobalLock) 块内调用,否则会抛出
IllegalMonitorStateException。
- 示例上下文(基于问题中的
waitAsyncStart):
synchronized (mGlobalLock) {
while (starterResult[0] == null) {
try {
mGlobalLock.wait(); // 释放锁并等待
} catch (InterruptedException ignored) {
}
}
}
当前线程(通常为主线程)已通过
synchronized 持有
mGlobalLock 的锁。
#### 2.
工作机制mGlobalLock.wait() 的执行分为以下步骤:
1.
释放锁(monitor):
- 调用
wait() 时,当前线程**原子性地释放
mGlobalLock 的 monitor**(即锁所有权)。
- 这允许其他线程(例如异步任务线程)通过
synchronized (mGlobalLock) 获取该锁,执行关键操作(如设置结果或更新窗口状态)。
线程进入等待状态状态**:
- 当前线程被挂起,加入
mGlobalLock 的**等待集(wait set)**,不再占用 CPU。
- 等待集是每个 Java 对象(monitor)维护的一个线程集合,存储所有因调用
wait() 而阻塞的
等待唤醒**等待唤醒**:
- 线程保持阻塞,直到以下任一事件发生:
- 其他线程对
mGlobalLock 调用
notify()(唤醒等待集中的一个线程)或
notifyAll()(唤醒所有等待线程)。
- 线程被中断(抛出
InterruptedException)。
- 如果指定了超时(如
wait(long timeout)),则等待时间到后自动唤醒(本例中未指定超时)。
- 在
waitAsyncStart 中,异步任务(通过
handler.post)完成后调用:
synchronized (mGlobalLock) {
mGlobalLock.notifyAll(); // 唤醒所有等待线程
}
4. **重新竞争锁**:
- 被
notifyAll() 唤醒后,当前线程从等待集移除,但不会立即恢复执行。
- 它必须**重新竞争
mGlobalLock 的所有权**。只有当其他线程释放锁(退出
synchronized 块)后,当前线程才能重新获取锁并继续执行。
- 获取锁后,线程从
wait() 调用点继续,检查条件(如
starterResult[0] == null异常处理循环。
5. **异常处理**:
- 如果线程在等待时被中断,会抛出
InterruptedException。在
waitAsyncStart 中,异常被忽略(
catch (InterruptedException ignored)),确保线程继续等待直到结果非空。
#### 3. **在
waitAsyncStart 中的具体作用**
结合用户提供的
waitAsyncStart 代码:
- 当前线程(主线程)已持有
mGlobalLock,调用
waitAsyncStart post 异步任务到另一个 Handler(如动画线程)。
- 在 while 循环中,
mGlobalLock.wait():
- **释放锁**:允许异步任务获取
mGlobalLock,设置
starterResult[0] 并调用
notifyAll()。
- *
唤醒后继续线程暂停,等待异步任务完成。
- **唤醒后继续**:异步任务调用
notifyAll() 后,主线程被唤醒,重新获取锁,检查
starterResult[0],若非空
原子性回结果。
#### 4. **关键特性**
- **原子性**:
wait() 释放锁和进入等待是原子的,避免竞争条件。
- **避免死锁**:释放锁允许其他线程
性能优化关键操作,防止主线程与 Handler 线程死锁。
- **性能优化**:
WindowManagerGlobalLock 支持 CPU boos
鲁棒性droid 构建系统),在锁竞争和等待期间优化性能。
- **鲁棒性**:忽略
InterruptedException 确保线程不会因意外中断而失败。
#### 5. **注意点**
- **必须在 synchroniz
虚假唤醒否则抛
IllegalMonitorStateException。
- **虚假唤醒**:Java 的
wait() 可能因系统原因被意外唤醒,因此需在循
锁竞争while (starterResult[0] == null))。
- **锁竞争**:多线程竞争
mGlobalLock 时,唤醒后的线程可能因其他线程持有锁而延迟恢复。
- **Android 上下文**:在 AOSP 中,
mGlobalLock 是全局同步点,广泛用于窗口/活动管理,确保多显示器、折叠屏等场景的线程安全。
#### 总结
mGlobalLock.wait() 是 Java 同步机制的核心,通过释放锁、等待通知和重新获取锁,实现线程间协作。在
waitAsyncStart 中,它确保主线程等待异步任务完成而不会阻塞 Handler,同时保持
WindowManagerGlobalLock 的线程安全。这是 Android 窗口和活动管理中避免死锁、实现高效同步的关键设计。
`