我真的是Java并发方面的新手,我正在尝试实现以下规范:

  • 我们有一个 parking 场,里面有一些公园景点
  • 每辆车都表示为一个线程,该线程会不断地从“驾驶- parking ”更改车的状态。每辆车都有自己的 parking 位。
  • 当汽车处于 parking 状态时,它将尝试在一个地点 parking (不必在其地点 parking )。如果该地点是免费的,则将其停放,否则它将跳过此停放阶段,然后返回开车。
  • 除非景点所有者想 parking ,否则汽车将保留在该地点。

  • 这不是确切的规范,但是我唯一的问题是:

    我无法使汽车跳过转弯。如果两辆车在同一地点 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()方法上的原因。

    09-16 00:23