首页 > 解决方案 > 在 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;
        }       
    }

}

}

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

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

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

标签: javamultithreadingconcurrencyparallel-processing

解决方案


多个线程试图同时访问该布尔值:更新变量时的竞争条件。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
    }  
 }

推荐阅读