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;
}
}
}
}
基本上,这个想法是我使用多线程逐行检查2个矩阵是否至少相差1个元素。
我通过我的主类激活这些线程,将行传递给执行器池。
但是,由于某种原因,即使满足 if 条件,布尔值似乎也不会更新为 false。
解决方案
多个线程试图同时访问该布尔值:更新变量时的竞争条件。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
}
}
推荐阅读
- go - 在 hugo 模板上使用 uniq inside range
- swift - URLSessionDownloadTask - 失败且没有明显错误
- node.js - 使用 Appbaseio 和 ReactiveSearch 索引用户查询
- python - python在XML中打印最后一个元素值
- reactjs - PurifyCSS 移除了必要的选择器
- r - 将多个图放在一个面板中
- python - 熊猫:按不同日期过滤每个客户
- swift - 如何使用 Vapor 响应图像?
- php - 如何让 $_GET 用相同的键读取第一个变量?
- javascript - Cypress.io - 根据 cy.route() 中的请求参数以编程方式设置响应