我们知道wait/notify/notifyAll 在执行前都需要获取对象锁。
一般程序:
synchronized obj {
// 条件不满足
obj.wait()
// 业务逻辑
}
线程A执行上面执行上面逻辑后,会一直阻塞。直到其他线程B调用ThreadA.interrupt() 或者 执行下面程序。线程A才会被唤醒,唤醒会进行抢锁(这里JVM可进行优化,判断有对象已经被抢锁后,可能直接将线程放入对象的等待队列,需要确认?),抢锁成功后,继续执行业务逻辑。
synchronized obj {
obj.notify/notifyAll
}
obj.wait(timeout)的区别时,时间到达后,提前进入强锁阶段。
网友评论