我正在尝试用Java来解决男女皆宜的浴室问题。简而言之,有一个浴室配有无限数量的男女厕所。男人和女人不能同时在浴室,但几个男人或女人可以。男性和女性由线程代表,浴室由监视器代表(具有同步方法的共享对象,监视并指示并发如何工作)。
现在回答我的问题。通常你会写一些类似的东西:
public synchronized void womanEnter()
{
while(menInTheBathroom>0 || menWaiting>0)
{
wait();
}
//enter bathroom
}
要唤醒这个过程你通知() 但我(我想)我需要能够分别通知男女。如果一个人进入浴室,我希望他通知队列中的所有人。我可以在监视器中使用几个信号量,但是在excersize中不允许这样做。我可以在监视器中使用我可以等待并通知的条件,如果可以的话,如何使用?我试过了,但是收到了一堆涉及非法监控状态的错误。
答案 0 :(得分:1)
您需要使用notifyAll
来捕获所有情况(通常notify
更具体)。您的while循环(不使用if
)可防止在不需要的情况下继续。
更高效,但也更冗长,您可以使用Condition
中锁定的java.util.concurrent.locks
。