Alguém pode explicar o que os modificadores transient
e volatile
significam em Java?
Alguém pode explicar o que os modificadores transient
e volatile
significam em Java?
Respostas:
Os modificadores volatile
e transient
podem ser aplicados aos campos das classes 1, independentemente do tipo de campo. Além disso, eles não têm relação.
O transient
modificador 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, null
para um tipo de referência e zero ou false
para um tipo primitivo. Observe que o JLS (consulte 8.3.1.3 ) não diz o que transient
significa, mas adia para a Especificação de serialização de objetos Java . Outros mecanismos de serialização podem prestar atenção à transient
integridade de um campo . Ou eles podem ignorá-lo.
(Observe que o JLS permite que um static
campo 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 volatile
modificador 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 << long
ou double
que 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.
volatile
e transient
palavras - chave
1) transient
palavra-chave é usada junto com variáveis de instância para excluí-las do processo de serialização. Se um campo for transient
seu valor, não será persistido.
Por outro lado, a volatile
palavra-chave é usada para marcar uma variável Java como "sendo armazenada na memória principal".
Toda leitura de uma volatile
variável será lida na memória principal do computador, e não no cache da CPU, e todas as gravações em uma volatile
variável serão gravadas na memória principal, e não apenas no cache da CPU.
2) transient
palavra-chave não pode ser usada junto com a static
palavra - chave, mas volatile
pode ser usada junto com static
.
3) as transient
variá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
transient
variável não pode ser usada junto com a static
palavra-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
static
e transient
deve 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.
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
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.