gpt4 book ai didi

java - 在 Java 中的多线程进程中更新 boolean 值

转载 作者:行者123 更新时间:2023-12-03 12:44:31 26 4
gpt4 key购买 nike

我有以下代码:

public class CheckIfSame implements Runnable {

private int[][] m;
private int[][] mNew;
private int row;
private boolean same;

public CheckIfSame(int[][] m,int[][] mNew,,int row,boolean same) {
this.m = m;
this.mNew = mNew;
this.row = row;
this.same = same;
}

@Override
public void run() {
for (int i = 0; i < mUpd[0].length; i++) {
if(m[row][i] != mUpd[row][i]) {
same = false;
}
}

}
}
基本上,这个想法是我使用多线程逐行检查2个矩阵是否至少有1个元素不同。
我通过我的主类激活这些线程,将行传递给执行程序池。
但是,由于某种原因,即使满足 if 条件, boolean 值 same 似乎也不会更新为 false。

最佳答案

多个线程试图同时访问该 boolean 值:a race condition同时更新 same 多变的。
多线程应用程序中非 volatile boolean 值的另一种可能情况是受编译器优化的影响 - 某些线程可能永远不会注意到 boolean 值的更改,因为编译器应该假设该值没有更改。因此,在特定触发器(例如线程状态更改)之前,线程可能正在读取陈旧/缓存数据。
您可以选择 AtomicBoolean .当您使用它时让多个线程访问 boolean 变量 .这将保证:

  • 同步。
  • 更新的可见性(AtomicBoolean 在内部使用 volatile int)。

  • 例如:
    public class CheckIfSame implements Runnable 
    {
    //...
    private AtomicBoolean same;

    public CheckIfSame(..., AtomicBoolean same)
    {
    //...
    this.same = same;
    }

    @Override
    public void run()
    {
    for (int i = 0; i < mUpd[0].length; i++)
    if(m[row][i] != mUpd[row][i])
    same.set(false); // <--race conditions hate this
    }
    }

    关于java - 在 Java 中的多线程进程中更新 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65281719/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com