`
bolutes
  • 浏览: 873719 次
文章分类
社区版块
存档分类
最新评论

Java多线程设计模式详解学习笔记五——GuardedSuppension

 
阅读更多

运行结果:

执行wait等待条件的变化:

执行wait的时候,线程是在等待什么?线程真正所等待的,是实例状态的变化。等待中的线程,正等待着警戒条件的变化。

只有了解“线程在等待什么”,就知道何时应该“调用notify/notifyAll”,也就是说在等待的东西完成的地方调用notify/notifyAll

wait与锁定:

当某个线程试图去执行某个实例的wait方法时,这个线程必须获取改实例的锁定。在synchronized方法中调用wait方法,在执行wait的时候,的确线程正获取this的锁定 。然而当线程执行this的wait方法后,会进入wait的等待区,这时,线程就会解除this的锁定。而线程可能会因为notify、notifyAll、或interrupt退出等待区。不过在实际执行下一个语句之前,必须再次获得this的锁定才行。

wait与notify、notifyAll的责任(复用性):

程序中只有RequestQueue类有用到wait/notifyAll,在ClientThread、ServerThread、Main等其他类中都没有出现wait/notifyAll。Guarded Suspension Pattern的实现是封装在RequestQueue类里的。之所以隐藏wait/notifyAll,是为了RequestQueue类的复用性。使用RequestQueue类的一方,并不需要考虑wait/notifyAll的问题,只要调用getRequest方法与putRequest方法就行了。

guarded wait:

意义是“被阻挡而等待”,线程使用wait等待,等到被notify/notifyAll再次测试条件的实例方法。使用wait等待的时间,其实是停止在停止在等待区里停止执行,所以不会浪费java执行环境的处理时间。

等待端的范例:

while(!ready)

唤醒端范例:

busy wait:

“忙碌等待”的意思,线程不适用wait等待,而是用yield(进可能把优先级让给其他线程),并不断测试条件的方法。因为等待中的线程也持续运行着,所以会浪费java虚拟机的时间。yield是Thread累的类方法。

等待端的范例:

唤醒端的范例:

ready=true;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics