我真的是Java兼容的新手,我正在尝试实现以下规范:
我们有一个停车场,有一些公园景点
每辆车都代表一条线,无休止地改变汽车状态从驾驶 - 停车.每辆车都有自己的停车位.
当汽车处于停车状态时,它会试图停在一个地方(不需要他的地点).如果该地点是免费的,那么它停在其他地方,它将跳过这个停车阶段并返回开车.
除非现场车主想要停车,否则该车仍然在现场.
这不是确切的规范,但我唯一的问题是:
我无法让汽车在转弯时跳过.如果两辆车选择相同的位置,则一辆车停放,另一辆车等待,直到公园空闲.这不是我想要的行为.我的第一个想法是简单地将read和write同步到一个占用的变量:
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).如果愿意同步,两辆车可以在同一地点停车怎么办?
谢谢
如果愿意同步,两辆车可以在同一地点停车怎么办?
它实际上很简单.Car1捕获spot0并开始在循环内部park()
方法中等待所有者(您没有提供代码).在等待时,它拥有监视器并且不允许任何人在spot0上调用同步方法.
这就是为什么car2挂在willingToPark()
方法上的原因.