我正在编写一个多人游戏,我需要一些可以代表比赛场地的解决方案。我为演示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/