我正在编写一些 java 代码并有一个人为的示例,但我不确定这是否是线程安全代码。
基本上我有一个 while 循环来检查一个 bool,我想从另一个线程将 bool 设置为 false。
注意以下事项
public void start() {
mRunning = true;
thread = new Thread()
{
public void run()
{
while (mRunning) {
}
}
}
thread.start();
}
然后我在类上有一个可以从另一个线程调用的修改器...
public void stop() {
mRunning = false;
}
此代码会导致不良行为吗?如果是这样,我应该只这样做吗?
public void stop() {
sychronized(this) {
mRunning = false;
}
}
最佳答案
如果你只需要线程间通信,而不是mutual exclusion , 使用 volatile
变量:
private static volatile boolean mRunning = false;
如果只有一个唯一的线程修改一个变量,而其他线程只读取这个变量,那么你不需要额外的同步,volatile
就足够了(它保证任何读取该字段的线程都会看到最近写入的值)。
Should I just do this?
public void stop() {
synchronized (this) {
mRunning = false;
}
}
你可以,但你不应该!无论如何,你会得到意想不到的行为(这 answer 解释了原因)。
在问题中描述的情况下,只需使用一个 volatile
变量,它也不那么冗长,与 synchronized
block 相比,其性能可能更好.
关于java - 从其他线程访问 while 循环 bool 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51004654/