Eu estava lendo o JavaDoc para Threadlocal aqui
https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ThreadLocal.html
e diz "Instâncias ThreadLocal são tipicamente campos estáticos privados em classes que desejam associar o estado a um thread (por exemplo, um ID de usuário ou ID de transação)."
Mas minha pergunta é por que eles escolheram torná-lo estático (normalmente) - torna as coisas um pouco confusas ter um estado "por thread", mas os campos são estáticos?
fonte
ThreadLocal
para manter uma referência a um conjunto de hash que mapeia objetos para instâncias por thread.ThreadLocal
manteria seus próprios dados de segmento local, mesmo se essasThreadLocal
instâncias existissem no mesmo segmento. Não é necessariamente errado fazer isso - acho que pode ser o padrão menos popular dos doisTorne-o estático ou, se estiver tentando evitar quaisquer campos estáticos em sua classe - torne a própria classe um singleton e então você pode usar com segurança o ThreadLocal em nível de instância, contanto que tenha esse singleton disponível globalmente.
fonte
Não tem que ser. O importante é que seja um único.
fonte
O motivo é que as variáveis são acessadas por meio de um ponteiro associado ao thread. Eles agem como variáveis globais com escopo de thread, portanto, estático é o ajuste mais próximo. Esta é a maneira que você obtém o estado local do thread em coisas como pthreads, então isso pode ser apenas um acidente de história e implementação.
fonte
Um uso para um threadlocal em uma instância por thread é se você deseja que algo seja visível em todos os métodos de um objeto e que seja seguro para thread sem sincronizar o acesso a ele, como faria para um campo comum.
fonte
Consulte este , este dar uma melhor compreensão.
Em suma, o
ThreadLocal
objeto funciona como um mapa de valor-chave. Quando oThreadLocal
get/set
método invocar o thread , ele irá recuperar / armazenar o objeto do thread na chave do mapa e o valor no valor do mapa. É por isso que diferentes threads têm diferentes cópias de valor (que você deseja armazenar localmente), porque ele reside em diferentes entradas do mapa.É por isso que você só precisa de um mapa para manter todos os valores. Embora não seja necessário, você pode ter vários mapas (sem declarar estático) para manter cada objeto de thread também, o que, é totalmente redundante, por isso a variável estática é preferida.
fonte
static final ThreadLocal
variáveis são thread-safe.static
torna a variável ThreadLocal disponível em várias classes para o respectivo thread apenas. é uma espécie de descaracterização de variável global das respectivas variáveis locais de thread em várias classes.Podemos verificar a segurança deste thread com o seguinte exemplo de código.
CurrentUser
- armazena o ID do usuário atual em ThreadLocalTestService
- Serviço simples com método -getUser()
para buscar o usuário atual de CurrentUser.TestThread
- esta classe é usada para criar vários threads e definir IDs de usuário simultaneamente.
.
.
Execute a classe principal TestThread. Resultado -
Resumo da análise
main
a execução termina e imprime o usuário atual como "62", aForkJoinPool.commonPool-worker-1
execução paralela termina e imprime o usuário atual como "87", aForkJoinPool.commonPool-worker-2
execução paralela termina e imprime o usuário atual como "31", aForkJoinPool.commonPool-worker-3
execução paralela termina e imprime o usuário atual como "81"Inferência
Threads simultâneos são capazes de recuperar IDs de usuário corretos, mesmo que tenham sido declarados como "ThreadLocal final estático"
fonte