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)
是的,它由内存模型保证。
在调用和子线程方法的第一个操作之间有一个发生。start()
run()
有一个之前发生的子线程的最后一个动作(任何种类)和与join()
父线程返回。
这在JLS 17.4.5 中指定
这些足以确保子线程看到正确初始化的列表,而父线程看到正确填充的列表......在join()
.
归档时间: |
|
查看次数: |
50 次 |
最近记录: |