我真的是Java并发方面的新手,我正在尝试实现以下规范:
这不是确切的规范,但是我唯一的问题是:
我无法使汽车跳过转弯。如果两辆车在同一地点 parking ,则其中一辆将停放,另一辆将等到免费为止。这不是我想要的行为。
我的第一个想法是简单地将读取和写入同步到一个已占用的变量:
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;
}
}
如果我用三辆汽车来运行它,那么我最终将使car0在Spot1处 parking ,car1在Spot0处 parking ,car2在spot0处等待,因为car1正在执行同步块(synchronized block) parking (Car c)。如果willingToPark是同步的,我不知道怎么会有两辆车可以停在同一地点。
谢谢
最佳答案
实际上很简单。 Car1 捕获 spot0 ,并开始在park()
方法内部的循环中等待所有者(您未提供代码)。在等待时,它拥有监视器,并且不允许任何人在 spot0 上调用同步方法。这就是 car2 卡在willingToPark()
方法上的原因。