Как заменить приобретение и выпуск Java-семафора синхронизированными мониторами Java, ожиданием и уведомлением (все) - PullRequest
0 голосов
/ 22 марта 2012

Мой код работает с семафорами, но я хочу заставить эту работу работать с мониторами Java: ждать, уведомлять, уведомлять все и синхронизироваться вместо получения и выпуска.Может кто-нибудь сказать мне, как я могу это сделать?

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 ]

3 голосов
/ 22 марта 2012

Вы можете сделать это, используя синхронизированный и простой внутренний счетчик, например:

private int counter;

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

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

UPDATE: не понял, что это домашнее задание Что ж, надеюсь, я получу хорошую оценку!

0 голосов
/ 22 марта 2012

Я не думаю, что вы можете так устроить свой класс. Вы даже не можете написать useTrack() или метод stopUseTrack (), который использует синхронизацию, например.

Чаще всего люди переходят из синхронизации в семафоры. Почему вы думаете, что хотите пойти в противоположном направлении.

...