Object wait与notify使用

sancaiodm Java 2023-09-11 1205 0

使用时切记:必须由同一个lock对象调用wait、notify方法

  当线程A执行wait方法时,该线程会被挂起;

  当线程B执行notify方法时,会唤醒一个被挂起的线程A;

lock对象、线程A和线程B三者是一种什么关系?

可以想象一个场景:

  lock对象维护了一个等待队列list;

  线程A中执行lock的wait方法,把线程A保存到list中;

  线程B中执行lock的notify方法,从等待队列中取出线程A继续执行;


(1).wait()   //释放锁,进入等待

等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过,但运行时会收到一个异常:IllegalMonitorStateException。

调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。


(2).notify()  //唤醒其它争夺权限的线程

唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,

而是由JVM确定唤醒哪个线程,而且不是按优先级。

调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。


评论