Em Java, as outras variáveis básicas são atômicas, exceto as variáveis de 8 bytes e 64 bits de Long e Double.
O modelo de armazenamento Java exige que tanto as operações get quanto as de store sejam atômicas, mas para variáveis longas e duplas não voláteis, a JVM permite dividir uma leitura ou escrita de 64 bits em duas operações de 32 bits.
Se a leitura e a escrita ocorrerem em threads diferentes, ler um tipo não volátil longo pode resultar em 32 bits altos de um valor e 32 bits baixos do outro.
Então, mesmo que você não se importe com dados expirados, pode não ser seguro usar variáveis longas e duplas compartilhadas, mutáveis em um programa multithread, a menos que sejam declaradas voláteis ou protegidas com um bloqueio.
Falando em operações atômicas, significa que leitura e escrita são atômicas, como i=5; Esta é uma operação atômica.
No entanto, se a operação de dois átomos for realizada em conjunto, não é necessariamente atômica, como ler primeiro e depois escrever, então é possível que a variável tenha sido modificada após a leitura.
i++ é uma dessas operações, ler primeiro e depois escrever, então a variável inteira é atômica, não que i++ seja uma operação atômica.
Quando você usa for(int i=0; i<10000; i++){System.out.print(i)}
Você vai perceber que eu não imprimo 10.000 no final, e imprimo cerca de 8-9 mil.
Mas no caso do multi-threading, mesmo que a variável inteira seja atômica, pode haver problemas de segurança de thread, que é um problema de visibilidade de threads, então você precisa adicionar uma instrução volátil.
Esse modificador é uma variável forçada que é lida da memória a cada vez e não é armazenada em registradores. |