当前位置:  开发笔记 > 编程语言 > 正文

两个线程如何"进入""同步"方法

如何解决《两个线程如何"进入""同步"方法》经验,为你挑选了1个好方法。

我真的是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).如果愿意同步,两辆车可以在同一地点停车怎么办?

谢谢



1> AdamSkywalke..:

如果愿意同步,两辆车可以在同一地点停车怎么办?

它实际上很简单.Car1捕获spot0并开始在循环内部park()方法中等待所有者(您没有提供代码).在等待时,它拥有监视器并且不允许任何人在spot0上调用同步方法.
这就是为什么car2挂在willingToPark()方法上的原因.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有