O que são modificadores transitórios e voláteis?

126

Alguém pode explicar o que os modificadores transiente volatilesignificam em Java?

Vijay Bhaskar Semwal
fonte
3
Claramente, isso não era uma pergunta e, de qualquer maneira, é uma duplicata (e foi por isso que votei para fechar). Veja por exemplo Por que o Java tem variáveis ​​transitórias? e quando exatamente você usa a palavra-chave volátil em Java? (e muitos outros).
Pascal Thivent
possível duplicata de Para o que é usado "volátil"?
27410 Jeff
18
Esta é uma pergunta perfeitamente válida, equivalente a: stackoverflow.com/questions/215497/…
Barry Fruitman

Respostas:

156

Os modificadores volatilee transientpodem ser aplicados aos campos das classes 1, independentemente do tipo de campo. Além disso, eles não têm relação.

O transientmodificador diz ao subsistema de serialização de objetos Java para excluir o campo ao serializar uma instância da classe. Quando o objeto é desserializado, o campo será inicializado com o valor padrão; ou seja, nullpara um tipo de referência e zero ou falsepara um tipo primitivo. Observe que o JLS (consulte 8.3.1.3 ) não diz o que transientsignifica, mas adia para a Especificação de serialização de objetos Java . Outros mecanismos de serialização podem prestar atenção à transientintegridade de um campo . Ou eles podem ignorá-lo.

(Observe que o JLS permite que um staticcampo seja declarado como transient. Essa combinação não faz sentido para serialização de objetos Java, pois não serializa estática de qualquer maneira. No entanto, pode fazer sentido em outros contextos, portanto, há alguma justificativa para proibindo-o de imediato.)

O volatilemodificador informa à JVM que as gravações no campo devem sempre ser sincronizadas na memória e que as leituras do campo devem sempre ser lidas na memória. Isso significa que os campos marcados como voláteis podem ser acessados ​​e atualizados com segurança em um aplicativo multithread sem usar a sincronização nativa ou padrão baseada em biblioteca. Da mesma forma, leituras e gravações em campos voláteis são atômicas. (Isso não se aplica a >> campos não voláteis << longou doubleque podem estar sujeitos a "rasgar palavras" em algumas JVMs.) As partes relevantes do JLS são 8.3.1.4 , 17.4 e 17.7 .


1 - Mas não para variáveis ​​ou parâmetros locais.

Stephen C
fonte
10

volatilee transientpalavras - chave

1) transientpalavra-chave é usada junto com variáveis ​​de instância para excluí-las do processo de serialização. Se um campo for transientseu valor, não será persistido.

Por outro lado, a volatilepalavra-chave é usada para marcar uma variável Java como "sendo armazenada na memória principal".

Toda leitura de uma volatilevariável será lida na memória principal do computador, e não no cache da CPU, e todas as gravações em uma volatilevariável serão gravadas na memória principal, e não apenas no cache da CPU.

2) transientpalavra-chave não pode ser usada junto com a staticpalavra - chave, mas volatilepode ser usada junto com static.

3) as transientvariáveis ​​são inicializadas com o valor padrão durante a desserialização e a atribuição ou restauração do valor deve ser tratada pelo código do aplicativo.

Para mais informações, consulte o meu blog:
http://javaexplorer03.blogspot.in/2015/07/difference-between-volatile-and.html

Rajesh Dixit
fonte
2
A razão pela qual a transientvariável não pode ser usada junto com a staticpalavra-chave é que as variáveis ​​estáticas pertencem a uma classe e não a nenhuma instância individual. O conceito de serialização diz respeito ao estado atual do objeto. Somente os dados associados a uma instância específica de uma classe é serializado, portanto, campos de membro estático são ignorados durante a serialização
Chaklader Asfak Arefe
Na verdade, o JLS permite statice transientdeve ser usado em conjunto. O problema é que faz pouco sentido, porque os mecanismos de serialização típicos não persistem estática de qualquer maneira.
Stephen C
7

Volátil significa que outros threads podem editar essa variável específica. Portanto, o compilador permite acesso a eles.

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

Transitório significa que, quando você serializa um objeto, ele retornará seu valor padrão na desserialização

http://www.geekinterview.com/question_details/2

Raynos
fonte
5
"Então o compilador permite acesso a eles." Sua frase sugere que os tópicos não têm acesso por padrão. Agora, li o link e a outra resposta que entendi: o compilador não faz nenhum tipo de armazenamento intermediário específico da thread para a variável, para que outras threads possam ver as alterações imediatamente.
helios
Eu tenho o uso C de volátil e java uso de volátil confuso. Eu quis dizer que o compilador garante que ele tenha acesso ao valor actaul do campo em vez de um valor em cache.
Raynos 23/08/10
isso significa mais do que isso.
Stephen C
1

Transitório:

Primeiro, precisamos saber onde ele precisava, como preencher a lacuna.

1) Um transitório do modificador de acesso é aplicável apenas ao componente variável. Não será usado com método ou classe.

2) A palavra-chave transitória não pode ser usada junto com a palavra-chave estática.

3) O que é serialização e onde é usado? Serialização é o processo de tornar o estado do objeto persistente. Isso significa que o estado do objeto é convertido em um fluxo de bytes para ser usado para persistir (por exemplo, armazenar bytes em um arquivo) ou transferir (por exemplo, enviar bytes pela rede). Da mesma maneira, podemos usar a desserialização para recuperar o estado do objeto de bytes. Este é um dos conceitos importantes na programação Java, porque a serialização é usada principalmente na programação de redes. Os objetos que precisam ser transmitidos pela rede precisam ser convertidos em bytes. Antes de entender a palavra-chave transitória, é preciso entender o conceito de serialização. Se o leitor souber sobre serialização, pule o primeiro ponto.

Nota 1) Transitório é usado principalmente para o processo de serialização. Para isso, a classe deve implementar a interface java.io.Serializable. Todos os campos da classe devem ser serializáveis. Se um campo não for serializável, ele deve ser marcado como transitório.

Nota 2) Quando o processo desserializado ocorre, eles são configurados com o valor padrão - zero, falso ou nulo conforme a restrição de tipo.

Nota 3) Palavra-chave transitória e sua finalidade? Um campo declarado com modificador transitório não participará do processo serializado. Quando um objeto é serializado (salvo em qualquer estado), os valores de seus campos transitórios são ignorados na representação serial, enquanto o campo diferente dos campos transitórios participará do processo de serialização. Esse é o principal objetivo da palavra-chave transitória.

Vishal Sheth
fonte