两个线程如何“在”“同步”方法中
我真的是Java并发的新手,我正在尝试实现以下规范:
- 我们有一个停车场,里面有一些停车位
- 每辆车都表示为一个线程,它无休止地改变汽车状态从驾驶 - 停车。每辆车都有自己的停车位。
- 当汽车处于停车状态时,它会尝试将车停在某个位置(不需要他的位置)。如果这个地方是免费的,那么它就会停车,否则它将跳过这个停车阶段并返回驾驶。
- 除非车主想要停车,否则汽车将保持在原地。
这不是确切的规格,但我遇到的唯一问题是以下内容:
我无法让汽车跳过转弯。如果两辆车选择相同的地点,那么一辆停在车上,另一辆等待,直到公园空闲。这不是我想要的巴赫维奥尔。我的第一个想法是简单地将读取和写入同步到占用的变量:
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停在点1,car1停在点0,car2在点0上等待,因为car1正在执行同步块停车(Car c)。我不明白如果愿意的ToPark是同步的,两辆车怎么可能停在同一个地方。
谢谢