java - Java中如何处理数组同步

标签 java multithreading synchronization

我有一个带有整数数组的对象,以及一个可以修改它的方法,仅锁定数组的一个元素:

public void setArray(Integer position, int num) {
    synchronized (myarray[position]) {
        myarray[position] = num;
    } 
}

然后我想计算数组的平均值,但要做到这一点,我需要“锁定”整个对象,并确保其他线程没有执行 setInteger 方法,直到我的calculateAverage 完成。我怎样才能做到这一点?

如果我写: 同步(MyObject){...} 它不起作用,因为我锁定了不同的东西......

最佳答案

您当前的方法不起作用;您没有锁定 myarray 而是锁定从中引用的 Integer 对象;另一个线程可能会看到无序的更新,或者一段时间内看不到更新,或者根本看不到更新。

有一个更好的解决方案 - 将 myarray 声明为 AtomicIntegerArray myarray;。更新至AtomicIntegerArray始终正确同步;保证其他线程立即以正确的顺序看到它们。

如果您能够以一种不更新数组相同元素的方式在线程之间分配工作,那就更好(更高效) - 线程同步总是会产生一些成本。

关于java - Java中如何处理数组同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58784811/

相关文章:

java - 两种方法之间的锁使一种方法挨饿

java - java lambda 可以有超过 1 个参数吗?

java - 无法使用 Windows 文件资源管理器找到使用 Android App 创建的文件夹或文件

java - 在指定日期执行 Java Swing 操作

c++ - 什么时候调用 stringbuf::flush?

c++ - (C/C++) 为什么使用全局变量同步单个读取器和单个写入器是有效的?

java - JSF 数据表单元格 - 如果内容太长,则剪切文本并替换为 "..."

java - Intellij 2019重新编译整个类问题

java - 为什么将 Thread.currentThread().isInterrupted() 与 try/catch 一起使用

java - 在 Android 中使用线程时出现错误