Noté que si dejo que un hilo llene una colección, al final del hilo después de join, veo que la colección se llena como se esperaba.

Con respecto al modelo de memoria Java, ¿siempre se garantiza que esto suceda?

¿Qué pasa si el hilo está almacenando las referencias de los objetos en la lista en el caché de la CPU?
En este caso, después de la unión, ¿el hilo de unión tendría que garantizar ver los cambios?

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

// persons ?

Hilo

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
    }
  }
1
GionJh 21 jul. 2020 a las 13:05

2 respuestas

La mejor respuesta

Sí, está garantizado por el modelo de memoria.

  • Hay un sucede antes entre la llamada start() y la primera acción del método run() del hilo secundario.

  • Hay un antes entre la última acción (de cualquier tipo) del subproceso secundario y el join() que regresa en el subproceso principal.

Esto se especifica en JLS 17.4 .5

Estos son suficientes para garantizar que el subproceso secundario ve una lista inicializada correctamente y el subproceso primario ve una lista correctamente poblada ... después de join().

6
Stephen C 21 jul. 2020 a las 10:33

Del Especificación del lenguaje Java § 17.4.5

...
Todas las acciones en un hilo suceden antes de cualquier otro hilo regresan con éxito de un join() en ese hilo.
...

4
Johannes Kuhn 21 jul. 2020 a las 10:10