Cuando el hilo tA llama a tB.join (), sus causas no solo esperan a que tB muera o tA se interrumpa, sino que crea una relación de suceso anterior entre la última declaración en tB y la siguiente declaración después de tB.join () en el hilo tA.
Todas las acciones en un subproceso suceden antes de que cualquier otro subproceso regrese con éxito desde un join () en ese subproceso.
Significa programa
class App {
// shared, not synchronized variable = bad practice
static int sharedVar = 0;
public static void main(String[] args) throws Exception {
Thread threadB = new Thread(() -> {sharedVar = 1;});
threadB.start();
threadB.join();
while (true)
System.out.print(sharedVar);
}
}
Siempre imprimir
>> 1111111111111111111111111 ...
Pero programa
class App {
// shared, not synchronized variable = bad practice
static int sharedVar = 0;
public static void main(String[] args) throws Exception {
Thread threadB = new Thread(() -> {sharedVar = 1;});
threadB.start();
// threadB.join(); COMMENT JOIN
while (true)
System.out.print(sharedVar);
}
}
Puede imprimir no solo
>> 0000000000 ... 000000111111111111111111111111 ...
Pero
>> 00000000000000000000000000000000000000000000 ...
Siempre solo '0'.
Debido a que Java Memory Model no requiere 'transferir' un nuevo valor de 'sharedVar' de threadB a thread principal sin una relación heppens-before (inicio de hilo, unión de hilo, uso de palabra clave 'sincronizada', uso de variables AtomicXXX, etc.).