可运行的非最终字段是否不安全以提交给执行者?

时间:2014-10-13 17:55:38

标签: java concurrency

如果我有以下代码:

  public void foo() {
    Executors.newSingleThreadedExecutor().submit(
      new Runnable() {
        int x = 5;
        public void run() {
          System.out.println("x = " + x);
        }
      }
    );
  }

我保证会看到" x = 5",或者我也能看到" x = 0"因为println正在另一个可能看到x未初始化值的线程中执行?我从来没有目睹过这种情况,但我一直无法保证这不会发生(例如,如果xfinal,那么似乎它永远不会发生。)

1 个答案:

答案 0 :(得分:5)

最新的JMM中定义了许多"happens before" relationships。其中一个点是“启动一个线程”并提交给执行程序,它与启动一个线程有相同的保证(参见javadocs中的"memory consistency effects")。