java - 同步数组中的元素

标签 java arrays multithreading wrapper thread-synchronization

我是 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 对象是一个很好的模式的原因之一。请参阅此答案以获取更多详细信息:

Why is it not a good practice to synchronize on Boolean?

关于java - 同步数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12304571/

相关文章:

java - 将网页转换为 PDF 或图像

java - 如何限制动态查询只接受 select 语句?

java - 数组可以用作 HashMap 键吗?

python - 如何让 Sprite 在 Pygame 和 Python 中的所有计算机上均匀移动

java - 多线程应用程序中的事件处理

Java Fast 生成带零的字符串

java - 循环和逻辑语句

arrays - 创建具有 "hidden"额外索引的数组

php - 为什么这个 PHP-MySQL 代码不能正常工作?

java - 快速音频文件输出