Existe alguma diferença entre uma volatile
referência de objeto e AtomicReference
no caso de eu apenas usar get()
e set()
-methods AtomicReference
?
java
concurrency
auramo
fonte
fonte
Não, não há.
A energia adicional fornecida pelo AtomicReference é o método compareAndSet () e os amigos. Se você não precisar desses métodos, uma referência volátil fornecerá a mesma semântica que AtomicReference.set () e .get ().
fonte
Existem várias diferenças e trocas:
O uso de um
AtomicReference
get / set tem a mesma semântica JMM que um campo volátil (como o javadoc afirma), masAtomicReference
é um invólucro em torno de uma referência, portanto, qualquer acesso ao campo envolve uma busca adicional por ponteiro .O espaço ocupado pela memória é multiplicado (assumindo um ambiente de OOPs compactado, o que é verdadeiro para a maioria das VMs):
AtomicReference
= 4b + 16b (cabeçalho do objeto 12b + campo de ref 4b)AtomicReference
oferece uma API mais rica que uma referência volátil. Você pode recuperar a API para a referência volátil usando umAtomicFieldUpdater
, ou com Java 9 aVarHandle
. Você também pode alcançar diretamentesun.misc.Unsafe
se gosta de correr com uma tesoura.AtomicReference
em si é implementado usandoUnsafe
.Então, quando é bom escolher um sobre o outro:
AtomicReference
/AtomicFieldUpdater
/Unsafe
onde você tende a pagar em legibilidade e risco pelo ganho de desempenho. Se esta não é uma área sensível, basta procurarAtomicReference
. Os criadores de bibliotecas geralmente usam uma combinação desses métodos, dependendo dos JDKs direcionados, das restrições esperadas da API, das restrições de memória e assim por diante.fonte
O código fonte do JDK é uma das melhores maneiras de responder a confusões como essa. Se você observar o código no AtomicReference, ele usará uma variável volatie para armazenamento de objetos.
Então, obviamente, se você vai usar apenas get () e set () no AtomicReference, é como usar uma variável volátil. Mas, como outros leitores comentaram, o AtomicReference fornece semântica adicional do CAS. Portanto, primeiro decida se deseja ou não a semântica do CAS e, se desejar, use o AtomicReference.
fonte
AtomicReference
fornece funcionalidade adicional que uma variável volátil simples não fornece. Ao ler a Javadoc da API, você saberá disso, mas também fornece um bloqueio que pode ser útil para algumas operações.No entanto, a menos que você precise dessa funcionalidade adicional, sugiro que você use um
volatile
campo simples .fonte
volatile
campo pode ser usado como qualquer campo regular, enquanto acessar o valor em umaAtomicReference
requer passandoget
eset
métodos.Às vezes, mesmo se você usar apenas get e sets, AtomicReference pode ser uma boa opção:
Exemplo com volátil:
A implementação com o AtomicReference forneceria uma sincronização de cópia na gravação gratuitamente.
Pode-se dizer que você ainda poderia ter uma cópia adequada se substituísse:
com:
No entanto, é mais provável que o segundo seja removido por alguém acidentalmente no futuro durante a "limpeza de código".
fonte