"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 |
|
O thread está esperando que o mutex seja liberado
|
"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."