我是 Java 多线程的新手,不太了解发生了什么。
从在线教程和讲义中,我知道必须应用于非空对象的 synchronized
block 确保只有一个线程可以执行该代码块。由于数组是 Java 中的对象,因此可以对其应用同步。此外,如果数组存储对象,我也应该能够同步数组的每个元素。
我的程序有几个线程更新了一个数字数组,因此我创建了一个 Long
对象数组:
synchronized (grid[arrayIndex]){
grid[arrayIndex] += a.getNumber();
}
此代码位于我已扩展的线程类的 run()
方法中。数组 grid 由我的所有线程共享。但是,当在一个线程上运行相同的程序时,这不会返回正确的结果。
最佳答案
这是行不通的。重要的是要认识到 grid[arrayIndex] += ...
实际上是用新对象替换 grid
中的元素。这意味着您正在同步数组中的一个对象,然后立即用数组中的另一个对象替换该对象。这将导致其他线程锁定不同的对象,因此它们不会阻塞。您必须锁定一个常量对象。
您可以锁定整个数组对象,如果它永远不会被另一个数组对象替换:
synchronized (grid) {
// this changes the object to another Long so can't be used to lock
grid[arrayIndex] += a.getNumber();
}
这就是为什么锁定 final
对象是一个很好的模式的原因之一。请参阅此答案以获取更多详细信息:
关于java - 同步数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12304571/