Transient e volatile

Gostaria de saber se alguem pode me explicar ou indicar um link dizendo como funciona esses modificadores de atributos de classes ???

Peguei alguns livros mas nao falam como funcionam, e tb gostaria de saber se eles sao muito usados !!

Valeu a quem puder me ajudar… abraços

transient é usado em classes que implementam Serializable, e indica que o tal membro da classe não deve ser serializado.
volatile é usado em classes que devem ser acessadas por diversas threads (pode ser por diversos processadores), e indica que um procedimento especial deve ser usado pelo compilador Just-In-Time para garantir que esse membro da classe seja acessível por todas as threads de forma que todas possam ler o valor real (e não um que está no cache do processador.)

Deixa eu ver se entendi: Por isso então que se chama volatil? Porque é um valor que muda com muita frequencia e, logo, não se deve confiar no cache do processador. É isso?

Não é bem isso.
Digamos que você tenha uma máquina com dois ou mais processadores, e essa variável está na memória. Para acelerar o acesso à memória, normalmente cada processador tem uma cópia dos dados que estão na memória em seu cache. Isso costuma funcionar bem, exceto quando cada processador quer acessar essa variável. Nesse caso, é necessário usar uma instrução do processador para “invalidar” o cache: o processador 1, invalidando o cache, deve dessa forma comunicar-se com o processador 2, dizendo que o cache dele também está inválido, e o valor que vale é o que está na memória. (Obviamente não é invalidado o cache completo, que tem 1 a 4 MB nos processadores atuais; apenas uma página, tipicamente 1KB. Mas é sempre um grande overhead).
Se muda com muita freqüência ou não, isso não importa; o que importa é que a tal variável tem de ter um valor coerente entre as duas threads.
Em uma máquina com apenas um processador, essa diretiva não é considerada. (No caso do hyperthreading aí não sei se o just-in-time compiler também gera essas instruções de invalidar o cache antes de acessar a variável “volatile”.)

hehehe, muito loko!!!
Obrigado Thingol! Como sempre, vc arrebenta!

Sei que o tópico e meio antigo (6 anos atras) mas queria aproveitar pra tirar uma duvida.

A keyword transient melhora a aplicação em termos de performance?

Por exemplo, possuo um Managed Bean(uso framework jsf) que carrega alguns combo box específicos da página (algo como combo de bairros), algumas dessas páginas precisam ser serializadas e, baseado no que entendi sobre transient, coloquei os arrays referentes aos combos como transient visando uma melhor performance.

O meu pensamento está correto?

Desde já agradeço.

[quote=Deyhan]Sei que o tópico e meio antigo (6 anos atras) mas queria aproveitar pra tirar uma duvida.

A keyword transient melhora a aplicação em termos de performance?

Por exemplo, possuo um Managed Bean(uso framework jsf) que carrega alguns combo box específicos da página (algo como combo de bairros), algumas dessas páginas precisam ser serializadas e, baseado no que entendi sobre transient, coloquei os arrays referentes aos combos como transient visando uma melhor performance.

O meu pensamento está correto?

Desde já agradeço.[/quote]

o único tempo tempo que você vai economizar, ou ganhar se preferir o termo, é o que levaria para serializar e depois para des-serializar este atributo que você deixou transient… acredito que o seu tempo ganho nisso seja absurdamente baixo, então é um ganho que simplesmente não vale a pena (a menos que seu ambiente tenha um número enorme de acessos simultâneos fazendo isso ou que estes arrays sejam realmente grandes, ou um pouco de cada é claro).

Vale ressaltar ainda que quando você desserializar seu objeto, estes arrays não terão preenchimento, isso também não será uma boa ideia caso você precise do preenchimento deles ao desserializar…