Java监视器实现

时间:2013-02-25 00:35:53

标签: java concurrency monitoring monitor

我正在尝试用Java来解决男女皆宜的浴室问题。简而言之,有一个浴室配有无限数量的男女厕所。男人和女人不能同时在浴室,但几个男人或女人可以。男性和女性由线程代表,浴室由监视器代表(具有同步方法的共享对象,监视并指示并发如何工作)。

现在回答我的问题。通常你会写一些类似的东西:

public synchronized void womanEnter()
{
   while(menInTheBathroom>0 || menWaiting>0)
   {
      wait();
   }
    //enter bathroom
}

要唤醒这个过程你通知() 但我(我想)我需要能够分别通知男女。如果一个人进入浴室,我希望他通知队列中的所有人。我可以在监视器中使用几个信号量,但是在excersize中不允许这样做。我可以在监视器中使用我可以等待并通知的条件,如果可以的话,如何使用?我试过了,但是收到了一堆涉及非法监控状态的错误。

1 个答案:

答案 0 :(得分:1)

您需要使用notifyAll来捕获所有情况(通常notify更具体)。您的while循环(不使用if)可防止在不需要的情况下继续。

更高效,但也更冗长,您可以使用Condition中锁定的java.util.concurrent.locks