将本地新对象传递给线程,线程安全吗?

Dij*_*tra 10 java concurrency multithreading thread-safety

我有一个方法(下面的示例),它创建一个新列表,将一些东西放入其中,并将其传递给另一个线程进行操作.

这似乎是线程安全的.该列表是创建它的方法的本地.该方法在列表上运行,并且在对其进行操作之前不会将其传递给另一个线程.

但这感觉不对,因为列表是在两个单独的线程中访问的,但它不同步.

这是可接受的线程安全代码吗?

class App
{
  public static void main(String[] args)
  {
    final ArrayList<Integer> list = new ArrayList<Integer>();
    list.add(4);
    list.add(5);

    final ExecutorService es = Executors.newSingleThreadExecutor();
    es.execute(new Runnable() {
        @Override public void run()
        {
          for (Integer i : list)
            System.out.println(i);
        }});
    es.shutdown();
  }
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 11

它是安全的,因为一个线程写入列表,然后另一个线程从列表中读取,并且执行器服务保证在您提交任务时发生之前的关系.

文档中引用:

java.util.concurrent及其子包中所有类的方法将这些保证扩展到更高级别的同步.特别是:

[...]

在向执行程序提交Runnable之前,线程中的操作发生在执行开始之前.类似地,提交给ExecutorService的Callables也是如此.