我真的是一个新的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停在spot1,car1停在spot0,car2在spot0上等待,因为car1正在执行同步停车场(Car c).我不知道如果愿意同步的话,两辆车可以停在同一个地方.
谢谢