同步数组Java

时间:2017-12-19 09:56:07

标签: java arrays object synchronized

我需要在2D对象数组中实现两个元素的原子更新。 对象表示某些东西是否可以存储在数组中的位置(x,y),以及某些东西是否已经存储了它的类型。因此,对象本身不会被改变,但它们的内部状态是。

我目前正在使用2个嵌套的同步语句,我正在同步访问数组中的两个元素:

        for (int i = 0; i < storage.length; i++) {
            synchronized (storage[i][j]) {
                synchronized (storage[i+1][j]) {
                    if (storage[i][j].isfree() && storage[i+1][j].isfree())
                        return (storage[i][j].store(true)&&storage[i+1][j].store(true));
                }
            }
            synchronized (storage[i][j]) {
                synchronized (storage[i][j+1]) {
                    if (storage[i][j].isfree() && storage[i][j+1].isfree())
                        return (storage[i][j].store(true)&&storage[i+1][j+1].store(true));
                }
            }
        }
    }

我循环遍历数组寻找空闲插槽(我可以存储占用两个插槽的项目)并无条件地输入两个同步块。在第二个块内部,我检查数组中的两个插槽是否为空,如果是这样,我存储一个新项目。否则我移动到下一个数组元素。

我的问题是这有效吗?当多个线程执行此代码时,更新是否是原子的。或者是否有更好的方法来实现相同的结果。但主要是我的问题是第一个问题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

首先:同步点可能成本高昂。您的代码在每个数组元素上同步两次(可能该代码在另一个循环内运行)。这只是你绝对想要避免的事情。

相反:创建一个有用的抽象。换句话说:实际填充数组的类 - 给出一个执行所需工作的方法。然后,让该方法在内部同步!