如何用Java监视器替换Java Semaphore的获取和释放同步,等待并通知(全部)

时间:2012-03-22 10:59:27

标签: java multithreading monitors

我的代码使用信号量,但我希望使用Java监视器:wait,notify,notifyAll和synchronized,而不是获取和释放。谁能告诉我怎么做到这一点?

public class Track {

    private final Semaphore mutex = new Semaphore(1,true);
    private final Semaphore use = new Semaphore(1,true);

    public Track(){}

    public void gebruikWissel(String v) throws InterruptedException
    {
        mutex.acquire();
        System.out.format("Trein %s maakt gebruik van de wissel", v);
        mutex.release();
    }

    public void useTrack() throws InterruptedException
    {
        use.acquire();
    }

    public void stopUseTrack()
    {
        use.release();
    }
}

2 个答案:

答案 0 :(得分:3)

你可以使用synchronized和一个简单的内部计数器来完成它,例如:

private int counter;

public synchronized void useTrack() throws InterruptedException
{
    while(counter == 1) {
      wait();
    }
    counter++;
}

public synchronized void stopUseTrack()
{
    counter--;
    notifyAll();
}

更新: 没有意识到这是功课。好吧,我希望我能获得好成绩!

答案 1 :(得分:0)

我认为你的课程结构并不合适。例如,您甚至无法编写使用同步的useTrack()或“stopUseTrack()”方法。

人们更常见的是将同步转到信号量。为什么你认为你想要朝着相反的方向前进。