线程填充集合和 Java 内存模型

Gio*_*nJh 1 java collections multithreading thread-safety

我注意到,如果我让一个线程填充一个集合,在 之后的线程末尾join,我会看到该集合按预期填充。

关于 Java 内存模型,这是否总是保证发生?

如果线程将列表中对象的引用存储在 cpu 缓存中怎么办?
在这种情况下,加入后加入线程必须保证看到变化?

final ArrayList<Person> persons = new ArrayList();
Thread myThread = new MyThread(persons);
myThread.start();
myThread.join();

// persons ?
Run Code Online (Sandbox Code Playgroud)

线

public class MyThread extends Thread {
    
    ArrayList<Person> persons;

    public MyThread(ArrayList<Person> persons){
     this.persons = persons;
    }

    public void run(){
      persons.add(new Person(...))
      // add more
    }
  }
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 6

是的,它由内存模型保证。

  • 在调用和子线程方法的第一个操作之间有一个发生start()run()

  • 有一个之前发生的子线程的最后一个动作(任何种类)和与join()父线程返回。

这在JLS 17.4.5 中指定

这些足以确保子线程看到正确初始化的列表,而父线程看到正确填充的列表......在join().