多线程 Java - 同步 - 警告 Android Studio
Multithread Java - synchronizing - warning Android Studio
我正在使用 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 更改为单个 ifs,情况会发生变化吗?
这意味着,如果您指望一个值被另一个线程更改,这是一种危险的编程策略,并且编译器不会知道它被不同的朋友访问,并且会假设它没有被优化。
任何可能被多个线程访问的变量都需要声明为 volatile 以通知编译器它被多个线程访问,并且在处理它时需要特别小心。如果您不知道,我敢打赌您还有许多其他多线程错误等待发生。
如果涉及第二个线程并更改状态,那么该值肯定会在第 1 行和第 3 行之间更改。特别是因为您似乎没有任何类型的线程同步,无论是否有意。
诚然,该代码似乎有点不安全,因为如果没有某种并发控制,通常不会有两个线程访问同一个变量。但这是推测,因为我没有看到您的其余代码。
无论如何,这是警告,不是错误。有时警告是错误的,这就是它们可以被抑制的原因。
不过,您可以将此视为您正在做一些不安全的事情的迹象。如果您想讨论实际的同步方面,也许您可以 post 一些更多的代码?
我正在使用 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 更改为单个 ifs,情况会发生变化吗?
这意味着,如果您指望一个值被另一个线程更改,这是一种危险的编程策略,并且编译器不会知道它被不同的朋友访问,并且会假设它没有被优化。
任何可能被多个线程访问的变量都需要声明为 volatile 以通知编译器它被多个线程访问,并且在处理它时需要特别小心。如果您不知道,我敢打赌您还有许多其他多线程错误等待发生。
如果涉及第二个线程并更改状态,那么该值肯定会在第 1 行和第 3 行之间更改。特别是因为您似乎没有任何类型的线程同步,无论是否有意。 诚然,该代码似乎有点不安全,因为如果没有某种并发控制,通常不会有两个线程访问同一个变量。但这是推测,因为我没有看到您的其余代码。
无论如何,这是警告,不是错误。有时警告是错误的,这就是它们可以被抑制的原因。
不过,您可以将此视为您正在做一些不安全的事情的迹象。如果您想讨论实际的同步方面,也许您可以 post 一些更多的代码?