一旦调用notify()方法,线程会立即放弃监视器,就像在wait()中一样。或者,当调用notify()时,将在方法执行完成后释放监视器。
调用notify()时线程将进入哪个状态。等待或阻止状态?
答案 0 :(得分:0)
拥有监视器的线程将在notify()
的情况下继续保持监视器。
notify()
/ notifyAll()
只是通知等待线程他们可以再次获得锁定。一旦线程获得监视器,它将退出wait()
方法并继续。
总结:一旦锁定自然释放(在同步块/方法之外),涉及notify()
/ notifyAll()
的线程将保持RUNNING
状态。
通知的目的只是在等待线程获得锁定后立即授权等待线程获得锁定。
答案 1 :(得分:0)
只要对象上的 synchronized ,线程就会保存对象的监视器。通知的线程将移至BLOCKED
状态,并且一旦拥有的线程通过保留以前保留监视器的同步块/方法,就会获得监视器。
例如,如果线程A在对lock.wait()
的调用中阻塞而线程B调用lock.notify()
,则线程A将离开WAITING
状态并进入BLOCKING
状态**,但是线程A不会继续执行(即进入RUNNABLE
状态),直到线程B离开synchronized
的{{1}}块。
**假设没有其他线程等待
lock
,因为订单无法保证通知线程,这就是为什么你应该使用lock
作为规则(除非你知道你在做什么,并且有充分的理由不这样做。)
使用代码:
notifyAll()