【问题标题】:Updating a boolean value in multithreaded process in Java在 Java 中的多线程进程中更新布尔值
【发布时间】:2020-12-13 23:17:09
【问题描述】:

我有以下代码:

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 条件,布尔值似乎也不会更新为 false。

【问题讨论】:

    标签: java multithreading concurrency parallel-processing


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      相关资源
      最近更新 更多