Java多线程设计模式:了解wait/notify机制

        通常多线程的间需要协调工作例如浏览器个显示图片线程displayThread想要执行显示图片任务必须等待下载线程downloadThread将该图片下载完毕如果图片还没有下载完displayThread可以暂停当downloadThread完成了任务后再通知displayThread“图片准备完毕可以显示了”这时displayThread继续执行   以上逻辑简单说就是:如果条件不满足则等待当条件满足时等待该条件线程将被唤醒在Java中这个机制实现依赖于wait/noty等待机制和锁机制是密切关联例如:


     synchronized(obj) {
  while(!condition) {
  obj.wait;
  }
  obj.doSomething;
  }



  当线程A获得了obj锁后发现条件condition不满足无法继续下处理于是线程A就wait

  在另线程B中如果B更改了某些条件使得线程Acondition条件满足了就可以唤醒线程A:


 synchronized(obj) {
  condition = true;
  obj.noty;
  }



  需要注意概念是:

  # objwait, noty思路方法前必须获得obj锁也就是必须写在synchronized(obj) {...} 代码段内

  # obj.wait线程A就释放了obj否则线程B无法获得obj锁也就无法在synchronized(obj) {...} 代码段内唤醒A

  # 当obj.wait思路方法返回后线程A需要再次获得obj锁才能继续执行

  # 如果A1,A2,A3都在obj.wait则Bobj.noty只能唤醒A1,A2,A3中个(具体哪个由JVM决定)

  # obj.notyAll则能全部唤醒A1,A2,A3但是要继续执行obj.wait条语句必须获得obj锁因此A1,A2,A3只有个有机会获得锁继续执行例如A1其余需要等待A1释放obj锁的后才能继续执行

  # 当Bobj.noty/notyAll时候B正持有obj锁因此A1,A2,A3虽被唤醒但是仍无法获得obj锁直到B退出synchronized块释放obj锁后A1,A2,A3中个才有机会获得锁继续执行

Tags: 

延伸阅读

最新评论

发表评论