我正在使用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,是否会更改?
答案 0 :(得分:1)
这意味着如果你指望另一个线程更改的值是一个危险的编程策略,并且编译器不会知道它被不同的朋友访问并且会优化,假设它不是。
任何可能被多个线程触及的变量都需要声明为volatile,以通知编译器它被多个线程触及,并且需要特别注意处理它。如果你不知道我敢打赌你还有十几个其他的多线程错误等待发生。
答案 1 :(得分:0)
如果涉及第二个线程并且更改状态,那么值肯定会在第1行和第3行之间发生变化。特别是因为您似乎没有任何类型的线程同步,无论是否有意。 当然,代码似乎有点不安全,因为如果没有某种并发控制,通常不会有两个线程访问同一个变量。但这是猜测,因为我没有看到你的其余代码。
无论如何,这是一个警告,而不是错误。有时警告是错误的,这就是他们被压制的原因。
你可以看到这是一个迹象,表明你有些不安全的东西。也许您可以发布更多代码,以防您想讨论实际的同步方面?