多线程Java - 同步 - 警告Android Studio

时间:2015-03-13 20:54:09

标签: java android multithreading intellij-idea

我正在使用Android Studio(intelliJ-idea)进行Android开发。我收到这条代码的警告:

    if (status == STATUS_SOLVING) {
        if (!solverThread.isAlive())
            if (status != STATUS_SOLVED) // <<<<<<  WARNING THIS LINE
                status = STATUS_DATA_COLLECTING;
    }

上面的线条给了我一个警告,说这种情况总是如此。如果整个程序在一个线程上运行,我可以理解为什么会这样。

但由于我的程序使用并行线程来更改status的值,这是否意味着上述代码段中第1行和第3行之间的这种情况可能会发生变化?

这是一个有效的警告吗?我错过了什么吗?

如果使用&&运算符将嵌套ifs更改为单个if,是否会更改?

2 个答案:

答案 0 :(得分:1)

这意味着如果你指望另一个线程更改的值是一个危险的编程策略,并且编译器不会知道它被不同的朋友访问并且会优化,假设它不是。

任何可能被多个线程触及的变量都需要声明为volatile,以通知编译器它被多个线程触及,并且需要特别注意处理它。如果你不知道我敢打赌你还有十几个其他的多线程错误等待发生。

答案 1 :(得分:0)

如果涉及第二个线程并且更改状态,那么值肯定会在第1行和第3行之间发生变化。特别是因为您似乎没有任何类型的线程同步,无论是否有意。 当然,代码似乎有点不安全,因为如果没有某种并发控制,通常不会有两个线程访问同一个变量。但这是猜测,因为我没有看到你的其余代码。

无论如何,这是一个警告,而不是错误。有时警告是错误的,这就是他们被压制的原因。

你可以看到这是一个迹象,表明你有些不安全的东西。也许您可以发布更多代码,以防您想讨论实际的同步方面?