有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程在Java多线程进程中更新布尔值

我有以下代码:

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;
        }       
    }

}

}

基本上,这个想法是我使用多线程逐行检查两个矩阵是否至少相差1个元素

我通过主类激活这些线程,将行传递给执行器池

但是,出于某种原因,布尔值似乎不会更新为false,即使满足if条件


共 (1) 个答案

  1. # 1 楼答案

    多个线程试图同时访问该布尔值:在更新same变量时访问race condition

    多线程应用程序中非易失性布尔值的另一种可能情况是受到编译器优化的影响-一些线程可能永远不会注意到布尔值的更改,因为编译器应该假定该值没有更改。因此,在特定触发器(如线程状态发生更改)之前,线程可能正在读取过时/缓存的数据

    您可以选择一个^{}。当有多个线程访问布尔变量时使用它。这将保证:

    • 同步
    • 更新的可见性(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
        }  
     }