如何防止在不一致状态下读取坐标?

时间:2019-01-23 00:50:30

标签: java multithreading

如何确保具有公共实例访问权限的程序线程-在以下内容中定义 坐标类,无法读取状态不一致的坐标,即 setXY方法的两个命令?如果您可以修改类的解决方案- 坐标,即使你不能。

public class Coordinates {
 int x, y;
 public int[] getXY() {return new int[]{x, y};}
 public void setXY(int x, int y) {
 this.x = x;
 this.y = y;
 }
}

1 个答案:

答案 0 :(得分:0)

public class Coordinates {
    private int x;
    private int y;
    public synchronized int[] getXY() {return new int[]{x, y};}
    public synchronized void setXY(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

您可以如上所述修改代码。

该字段是私有的,这意味着其他类无法访问或修改此属性。调用该方法时,将获得对象实例的锁。方法调用完成后,该锁将自动释放。这样可以确保当前只有一个线程在访问该方法。

但是,以上代码仅适用于小规模并发-存在很大的性能问题。所有的getter和setter都只有单线程访问。在高并发情况下,也许有一种方法可以解决您的问题,但是您需要使问题更清楚。