我正在编写一个多人游戏,我需要一些可以代表比赛场地的解决方案。我为演示Synchronized2DArray类实现了,但是我认为这不是最好的方法。同步块锁定整个数组,而我只需要锁定一个单元格。是否可以仅锁定一个单元格,或者还有其他方法可以改善性能?

class Synchronized2DArray {
    private int[][] array;

    public Synchronized2DArray(int size) {
        array = new int[size][size];
    }

    public void setValue(int x, int y, int value) {
        synchronized (array) {
            array[x][y] = value;
        }
    }

    public int getValue(int x, int y) {
        synchronized (array) {
            return array[x][y];
        }
    }

.................
}

最佳答案

我认为您的真正问题在不同层面上:


您的抽象是“糟糕的”。您会看到,在良好的OO设计中,您创建了抽象的类;为了为您处理的事情创建合理,有用的模型。一个int值数组...仅提供了一点点抽象。
然后,对于锁的工作原理也有一个误解。您不是在“锁定”整个阵列。相反,您编写了确保对getValue()setValue()的调用进行序列化的代码。上面的代码使一个线程无法设置值,而另一个线程正在读取该值。那里有一个细微的差别。


因此,我的回答是:您应该退后一步,花一些时间思考


创建一个对象模型,以帮助您以一种真正的面向对象的方式实现您的想法。
什么样的并行活动是可能的,以及要优化的并行活动。


例如,您可以将当前的锁定方法更改为使用ReentrantReadWriteLock来代替。允许无限的读者访问;但要确保不会并行进行编写。

关于java - 提高同步二维阵列的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40611658/

10-12 00:12
查看更多