Как заменить приобретение и выпуск Java Semaphore синхронизированными мониторами Java, ожиданием и уведомлением (Все)

Мой код работает с семафорами, но я хочу заставить эту работу работать с мониторами 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 ответа

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

private int counter;

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

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

ОБНОВЛЕНИЕ: не понимал, что это была домашняя работа. Что ж, надеюсь, я получу хорошую оценку!

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

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

Другие вопросы по тегам