Я действительно новый на Java concurrency, и я пытаюсь реализовать следующие спецификации:
- У нас есть автостоянка, в которой есть парковые места.
- Каждый автомобиль представлен как нить, которая бесконечно меняет состояние автомобиля от вождения - парковка. У каждого автомобиля есть свое место для парковки.
- Когда автомобиль находится в состоянии парковки, он пытается припарковаться на месте (не обязательно его место). Если место бесплатное, тогда он припаркуется еще, он пропустит эту фазу парковки и вернется к приводу.
- Автомобиль остается на месте, если владелец места не захочет припарковаться.
Это не точная спецификация, но единственная проблема, которая у меня есть, следующая:
Я не могу заставить машину пропустить ход. Если две машины выберут одни и те же пятна, то один припаркован, а другой ждет, пока парк не станет свободным. Который не тот, что я хочу. Моя первая идея состояла в том, чтобы просто синхронизировать чтение и запись с занятой переменной:
class Car implements Runnable {
private CarState state = CarState.driving
run {
while(true) {
switch(state) {
case driving:
System.out.println(this + " driving.");
state = parking;
break;
case parking: Spot s = CarPark.getRandomSpot();
if(s.willingToPark(this)) {
System.out.println(s + " occupied. " + this
+ " skip park turn.");
} else {
s.park(this);
}
state = driving;
}
}
}
}
class Spot {
private boolean occupied = false;
private Car owner = new Car(...);
synchronized boolean willingToPark(Car c) {
if(occupied) {
return true;
} else {
occupied = true;
return false;
}
synchronized void park(Car c) {
System.out.println(c + " parking at " + this);
//don't care how this is implemented, just keep in mind
//that it will enter in a loop until the owner came back.
occupied = false;
}
}
Если я запустил это с тремя автомобилями, то в итоге я окажусь в автостоянке на месте1, car1 будет стоять на месте 0, car2 ждет на месте 0, потому что car1 выполняет синхронизированный блок-парк (Car c). Я не понимаю, как возможно, что две машины могут припарковаться в том же месте, если ReadyToPark синхронизируется.
Спасибо