"Olá, amigo!"

"Existe um tópico enorme por aí — o modelo de memória Java. Basicamente, você não precisa saber sobre ele ainda, mas será útil ouvir sobre ele."

"Para eliminar todos os problemas potenciais, o Java mudou seu mecanismo de gerenciamento de memória. Agora a memória não é simplesmente dividida em cache local de thread e memória global - o mecanismo é ainda melhor."

"E mais complicado!"

"Sim, melhor e mais complicado. É como um avião. Voar de avião é melhor do que andar, mas é mais complicado. Vou tentar explicar a nova situação de forma bem simples."

"Aqui está o que eles criaram. Um mecanismo para sincronizar a memória do thread local, chamado 'acontece antes', foi adicionado ao código. Várias regras/condições foram inventadas. Quando essas condições são satisfeitas, a memória é sincronizada ou atualizada para o atual estado.

"Aqui está um exemplo:"

Ordem Tópico 1 Tópico 2
1
2

101
102
103
104
105

201
202
203
204
205
public int y = 1;
public int x = 1;

x = 2;
synchronized(mutex)
{
 y = 2;
}
O thread está esperando que o mutex seja liberado

synchronized(mutex)
{
 if (y == x)
 System.out.println("YES");
}

"Uma dessas condições é a aquisição do mutex liberado. Se um mutex for liberado e readquirido, a memória será sincronizada antes da aquisição. O thread 2 verá os valores 'mais recentes' das variáveis ​​x e y, mesmo se você não os declara voláteis."

"Que interessante! E existem muitas dessas condições?"

"Chega - aqui estão algumas condições para sincronizar a memória:"

  • "Dentro de um único thread, qualquer comando ocorre antes de qualquer operação que o siga no código-fonte."
  • "A liberação de um cadeado acontece antes que o mesmo cadeado seja adquirido."
  • "Uma saída de um bloco/método  sincronizado acontece antes que o bloco/método sincronizado seja inserido no mesmo monitor."
  • "A gravação de um campo volátil na memória acontece antes que o mesmo campo volátil seja lido da memória."
  • "Um fim do método run de um objeto Thread acontece antes que o método join() termine ou o método isAlive() retorne false no objeto no mesmo thread."
  • "Uma chamada para o método start() de um objeto Thread acontece antes que o método run() seja iniciado no objeto no mesmo thread."
  • "O fim do construtor ocorre antes do início do método finalize() desta classe."
  • "Uma chamada para o método interrupt() acontece antes que o thread determine que esse método foi chamado, porque uma InterruptedException foi lançada ou usando os métodos isInterrupted() ou interrupt()."

"Então, é tudo um pouco mais complicado do que eu pensava?"

"Sim, um pouco mais complicado..."

"Obrigado, Rishi. Vou pensar sobre isso."

"Não se preocupe muito com esse assunto. Chegará o momento em que você entenderá tudo sozinho. Por enquanto, seria melhor você entender o básico, em vez de mergulhar na densa floresta que é o funcionamento interno da máquina Java. O Java 9 será lançado e então tudo mudará novamente."

"O_o. Sim... Algumas coisas é melhor não saber."