Как заменить приобретение и выпуск 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(), который использует синхронизацию, например.
Люди чаще переходят от синхронизации к семафорам. Почему вы думаете, что хотите пойти в противоположном направлении.