Usando Volatile e Transient

Olá pessoal,

tava lá eu lendo uns tutoriais e derepente me deparo com o volatile, pra que serve?
Alguém tem um bom exemplo de como isso funciona?

Valeu

se me permite acho que vou perguntar aqui também o que é o modificador transient =)

Fique a vontade, se eu soubesse o que é transient tentava te ajudar.

Vi isso a pouco tempo mas ja não me recordo bem…

Um atributo marcado com o modificador transient sera ignorado na hora de serializar o objeto. Pode-se dizer que o atributo é irrelevante na hora de, por exemplo, salvar o objeto em um arquivo.

Se me lembro bem, um atributo marcado com volatile, o seu valor sera compartilhado entre todas as threads que acessam o objeto.

Nosso amigo Mikhas ja disse tudo mais se você estiver estudando para certificação vou somar umas duas coisinhas.
Variáveis Transient: Estará dizendo á JVM para ignorar essa variável quando você tentar serializar o objeto que a contem, esse modificador só pode ser aplicado a variáveis de instancia.
Variáveis Volatile: para exame tudo que você precisa saber é assim como transient, esse modificador só pode ser aplicado a variáveis de instancia.

[quote=taaqui]Nosso amigo Mikhas ja disse tudo mais se você estiver estudando para certificação vou somar umas duas coisinhas.
Variáveis Transient: Estará dizendo á JVM para ignorar essa variável quando você tentar serializar o objeto que a contem, esse modificador só pode ser aplicado a variáveis de instancia.
Variáveis Volatile: para exame tudo que você precisa saber é assim como transient, esse modificador só pode ser aplicado a variáveis de instancia. [/quote]

Então, nem é para o tão falado e desejado exame de certificação, mas sim para uma aplicação do dia a dia,
estava eu usando threads, runnable e coisas tal, e me deparo com o inusitado, o método stop() foi deprecated.
E em uma das soluções da Sun, ele usam volatile, funcionar, funciona, mas fico sem saber o que volatile faz exatamente, só copiei e colei.
Queria ter mais informações para usar no futuro.
http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

transient é mais fácil, uma variável marcada com esse modificador indica que o seu valor será ignorado durante uma serialização.

volatile é mais complicado, e precisa de uma explicação de como os computadores modernos funcionam. Muitos programadores ainda tem a visão de que as máquinas são microcontroladores glorificados: existe a memória, o disco rígido e o processador, e todos são separados entre si. A realidade é que tanto memória quanto disco fazem parte de uma hierarquia: no topo existem os registradores para acesso rápido para cada core, embaixo os registradores compatilhados entre os cores, depois a memória ram e, por fim, o disco rígido (para páginas de memórias não usadas no momento).

É fato que sempre haverá uma cópia do conteúdo da memória num nível superior (um cache). Porém, este conteúdo não é thread-safe; enquanto uma thread causa o cache num registrador, uma outra thread irá buscar o mesmo conteúdo (possivelmente desatualizado) no nível de RAM. O volatile é uma marcação que induz a JVM a não realizar caches na variável, ou então, a esperar a escrita de uma outra thread antes de realizar a leitura. A consequência é que o acesso a uma variável volatile é mais lenta que o normal.

Esse modificador não deve ser utilizado como alternativa a synchronized, ele garante acessos atualizados, mas não previne race-conditions.

1 curtida

volatile serve para indicar à JVM que uma variável de instância (ou estática) pode ser alterada por outra thread, e seu valor deve ser sempre recarregado da memória quando for usado em vez de supormos que o valor atual que está contido, por exemplo, em um registrador da CPU, é válido.

Agora entendi, apesar da explicação ser um pouco técnica, gostei das respostas.
Valeu pessoal.