Visão geral
Recentemente, eu estava lendo "Pensando em Java". E muito básico.
1.Volátil
O volátil é usado principalmente para sincronizar variáveis em multithreads.
Em geral, para melhorar o desempenho, cada encadeamento salvará uma variável na memória principal como uma cópia variável em sua própria memória quando estiver em execução, mas é fácil causar variáveis de réplica inconsistentes salvas em vários threads. valor variável na memória principal.
Quando uma variável é modificada por volátil, a variável não pode ser armazenada em cache na memória do thread. "." A cópia variável da área de memória; portanto, quando a variável muda, todos os threads chamando a variável obterão o mesmo valor, o que garante a visibilidade da variável no aplicativo (quando uma tarefa é modificada no aplicativo deve ser visual ) e o desempenho também foi reduzido de acordo (embora seja maior que o sincronizado).
No entanto, deve -se notar que a volátil só pode garantir que a operação seja a mesma peça de memória e não possa garantir a atomicidade da operação. Portanto, o volátil é geralmente usado para declarar variáveis de tipo simples, para que essas variáveis sejam atômicas, ou seja, algumas operações simples de atribuição e retorno serão garantidas que não sejam interrompidas. No entanto, quando o valor da variável é determinado por seu próprio anterior, o papel do volátil será inválido, o que é determinado pela natureza da palavra -chave volátil.
Portanto, tenha cuidado quando é volátil.
2.ThreadLocal
Primeiro, o ThreadLocal não tem um relacionamento de dez centavos com o thread local e não é um thread especial. Usa a variável, para que cada um thread possa alterar independentemente sua própria cópia sem afetar a cópia correspondente para outros threads. Na verdade, essa é uma maneira de trocar espaço pelo tempo (em oposição à sincronizada), o que reduz bastante o consumo de desempenho trazido pela sincronização do encadeamento (como sincronizado) e reduz a complexidade do controle simultâneo do encadeamento ao custo da memória.
Pessoalmente, acho que um exemplo típico é o uso do Threadlocal no código -fonte do Android sobre o Looper, que também inclui o uso básico do Threadlocal.
classe pública looper {private static string tag = "looper"; // sthreadlocal.get () retornará a NULL, a menos que você tenha chamado preparar (). private estático looper mmainlooper = nulo; sthreadlocal.set (novo looper ()); looper) {mmainlooper = looper; ..}
Mas deve-se notar que, embora o ThreadLocal e o sinconizado seja usado para resolver acesso simultâneo com vários thread, ainda existe uma diferença fundamental entre o ThreadLocal e o sincronizado. O sincronizado usa o mecanismo de bloqueio para que variáveis ou blocos de código só possam ser acessados por um thread em um determinado momento. O ThreadLocal fornece uma cópia da variável para cada thread, para que cada thread não acesse o mesmo objeto em um determinado momento, o que isola o compartilhamento de dados de dados por vários threads. Sincronizado é o oposto, é usado para obter compartilhamento de dados ao se comunicar entre vários threads. Ou seja, sincronizado é usado para compartilhamento de dados entre threads, enquanto o ThreadLocal é usado para isolamento de dados entre os threads. Portanto, o ThreadLocal não pode substituir sincronizado e sincronizado possui uma gama mais ampla de funções (mecanismo de sincronização).
3.Synchronized
A palavra -chave sincronizada é implementada automaticamente pelo Java usando o mecanismo de bloqueio. Todos os objetos no Java contêm automaticamente um único bloqueio (também conhecido como monitores). E antes que o encadeamento retorne desse método, todos os outros threads do objeto que desejam chamar o método marcado com sincronização na classe serão bloqueados. É claro que há também um bloqueio para cada classe (como parte do objeto de classe da classe), então você sabe ^. ^.
Finalmente, é importante observar que o sincronizado é a maneira mais segura no mecanismo de sincronização.