java - 为什么这段代码会失败?

标签 java multithreading java-threads

在审核this question时我注意到这段代码:

class MyThread extends Thread {
  private boolean stop = false;

  public void run() {
    while(!stop) {
      doSomeWork();
    }
  }

  public void setStop() {
    this.stop = true;
  }
}

但是我不明白为什么会失败。其他线程是否无法访问“实际”停止变量?

最佳答案

JIT 编译器可以重新排序应用程序中的读取和写入,只要

  1. Action 顺序一致并且
  2. 更改后的操作不会违反线程内语义。

这只是一种奇特的说法,所有操作的发生方式都应该与仅由单个线程执行相同。所以你可以让 JIT 重新编译你的代码,看起来像这样

class MyThread extends Thread {
  private boolean stop = false;

  public void run() {
    if(!stop){
       while(true){

       }
    }
  }

这是一种称为“提升”的合法优化。提升。它的行为仍然与串行相同,但在使用多线程时提供令人惊讶的结果。

通过将字段声明为 volatile,您将告诉 Java 不要执行任何重新排序。以及 Nathan Hughes 提到的内存一致性

关于java - 为什么这段代码会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16346005/

相关文章:

java - java.util.regex.Matcher 中的 groupCount() 总是返回 0

java - RxJava2 在 Single 上通过 flatMap 传递数据

MySQL:有效地填充存储过程中的表

java - 在 netbeans 7.0 中的 java swing 中关闭 Jframe 时应用程序退出

java - 为什么在Java中重载TreeMap中的Comparable时,Keyset中只有一个Key

java - 什么时候/为什么我应该在 Java 中使用多线程?

使用线程或多处理的 Python for 循环

应用程序和服务中的 Android 线程

java - 在线程调度程序中为已等待和通知的线程设置优先级

Java 线程转储 CPU 还是只是 IO 等待?