java - 从其他线程访问 while 循环 bool 是线程安全的吗?

标签 java multithreading thread-safety

我正在编写一些 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/

相关文章:

java - 仅 jlabel 的鼠标单击事件正确更新 jlabel 文本属性

java - 右移在 -1 上执行除以 2

没有 C++11 的 C++ 多线程?

iphone - NSCondition 是如何工作的?

c - 使用线程调试段错误

c# - 计算多个线程中的东西

c - 多线程访问树中的数据

java - 如何在不使用默认身份 validator 的情况下使用 JAXWS 访问受密码保护的 WSDL?

java - Spring messageSource 只能作为 xml 工作(不能作为 Spring-Java-Config)

ios - CoreData 和线程安全