java并发相关(三)—— object的wait() ,notifyAll(),notify() 方法与锁池、等待池

一、object的wait() ,notifyAll(),notify() 三个方法

  上述三个方法只能在Synchronized代码块内运行,显而易见其原理其实离不开Synchronized的实现。

  • wait()

  该方法用来将当前线程置入休眠状态,直到接到通知或被中断为止。在调用 wait()之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步块中调用 wait()方法。

  如果调用 wait()时,没有持有适当的锁,则抛出 IllegalMonitorStateException,它是 RuntimeException 的一个子类,因此,不需要 try-catch 结构。

  进入 wait()方法后,当前线程释放锁。此时线程实际进入图一中的waiting状态,进入图二中的waitset(等待池)待授权

  • notify()

  该方法也要在同步方法或同步块中调用,即在调用前,线程也必须要获得该对象的对象级别锁,的如果调用 notify()时没有持有适当的锁,也会抛出 IllegalMonitorStateException。

  该方法用来通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则线程规划器任意挑选出其中一个 wait()状态的线程来发出通知,并使它等待获取该对象的对象锁

  notify 方法其实只会选择一个等待池的待授权集合的对象A进入等待池的已授权集合,但此时还要等待持有锁的对象释放锁,对象A所在的线程也才有可能获取该对象锁。但实际上,锁池内等候的对象也会一起竞争这把锁,竞争到了才能进入同步代码块。

  • notifyAll()

  该方法与 notify ()方法的工作方式相同,重要的一点差异是:

  notifyAll 使所有原来在该对象上 wait 的线程统统退出 wait 的状态,即全部进入等待池的已授权集合。

二、我们知道线程一共有七种状态,之间转换如下图:

                                  (图一)

三、锁池与等待池

  只考虑重量级所得情况,那么可以认为等待池的线程从待授权集合进入已授权集合,就是进入了锁池的集合。

                              (图二)

 

posted @ 2019-10-16 23:57  豆豆323  阅读(467)  评论(1编辑  收藏  举报