Volatile

Alguém sabe um uso real para a palavra reservada volatile em java?

Eu li em alguns lugares mas o que vi foi que, com essa palavra, eu “aviso” a JVM que um atributo pode ser modificado por outras Threads… isso significaria que a própria JVM sincronizaria esse atributo?

[i]"The value of this variable will never be cached thread-locally: all reads and writes will go straight to “main memory”;

Access to the variable acts as though it is enclosed in a synchronized block, synchronized on itself."[/i]

http://www.javamex.com/tutorials/synchronization_volatile.shtml

Obrigado.

Quando você tem uma variável de tipo primitivo* marcada como volatile, a JVM se compromete a acessar essa variável usando instruções do processador que “bypassam” o cache de memória.

Por exemplo, digamos que várias threads, executadas por vários processadores, tentem acessar essa variável. Cada processador irá tentar acessar essa variável com o valor real dela, não com o valor que está no cache. Isso é uma operação lenta (porque pode envolver a invalidação do cache) mas garante que todos os processadores possam ver o valor real, não o valor “cached” desas variável.

  • E ainda por cima você tem de ver se a arquitetura do processador é de 32 ou 64 bits. Se a variável for do tipo “long” (64 bits) mas ela estiver marcada como “volatile” em um processador trabalhando em modo de 32 bits, pode ser que ela seja acessada em duas operações, não uma, e então você possa ter valores incoerentes nela.

Entendi… mas essa palavra me livra da preocupação com synchronized?
E sobre esse problema entre 32 e 64 bits, é por isso que ela não é mto usada?

Obg.

[quote=renamed]Entendi… mas essa palavra me livra da preocupação com synchronized?
E sobre esse problema entre 32 e 64 bits, é por isso que ela não é mto usada?[/quote]

Ela só te livra quando o acesso a variável restringe-se a:
a) Gravar um valor diretamente;
b) Ler o valor da variável diretamente;

Se você tiver operações mais complexas que isso, é melhor usar synchronized.

Não, ele não retira a preocupação com o synchronized.
Quando vc sincronizado um bloco de código vc está garantido que somente uma Thread estará acessando àquela referência em memória naquele instante, e que isto é válido para todos que pedirem “permissão” ao acesso. É como se fosse num restaurante você chegar na porta e pedir uma mesa. Enquanto não haver uma mesa disponível, vc fica esperando lá na porta. Assim que liberarem a mesa, vc se ocupa dela.
Já o volatile garante que TODOS as Threads ‘vejam’ determinada variável com o mesmo valor no mesmo instante, e não o valor que pode estar no cache do processador. Voltando a analogia do restaurante, é como se você pudesse ver quantas pessoas estão no restaurante naquele momento por um vidro, e não perguntando a recepcionista. Se vc perguntar na recepcionista(que aqui representa o cache) ela irá olhar no seu caderninho e lhe responderá o número que está anotado ali. Digamos que nesse restaurante tenha mais outra entrada. Nada garante que o número que está nos dois cadernos seja igual, e nem que ele reflita o valor exato de pessoas no restaurante.

Acho que já deu pra entender pra que servem as palavras synchronized e volatile neh!?!?

1 curtida