Implementação da classe ThreadLocal de threadlocal: variáveis compartilhadas dentro da faixa de encadeamento, cada encadeamento só pode acessá -lo e não pode acessar outros threads.
pacote com.ljq.test.thread; Módulo AB * Administrador @Author * */public class ThreadScopeSharedata {// Preparar os dados privados compartilhados Int Data = 0; <Thread, Integer> (); // Agora, modifique os dados no thread atual, dê as informações de modificação int = novo Random () .out.println (Thread.currenthread (). GetName () + "Coloque dados:" ;}} Classe estática A {public void get () {int data = ThreadData.get (Thread.currentThread ()); public void get () {int data = ThreadData.get (Thread.currentThread ());
Execute os resultados:
O papel e o objetivo do Threadlocal:
Para compartilhamento de dados em threads, ou seja, para o mesmo código do programa, vários módulos devem ser compartilhados ao executar no mesmo thread e outros dados são compartilhados ao executar em outro thread.
Cada encadeamento chama o método de conjunto do objeto Global Threadlocal, que é equivalente a adicionar um registro ao mapa interno. No final do encadeamento, você pode chamar o método Threadlocal.clear (), para que a memória seja liberada mais rapidamente, e não há problema em chamá -lo, porque o thread também pode liberar automaticamente as variáveis Threadlocal relacionadas.
Cenário de aplicação da Threadlocal:
O processamento de pedidos contém uma série de operações: reduza o inventário, adicione uma conta em execução e modifique a conta geral. , caso contrário, todas as operações são enviadas, o que exige que essas operações usem o mesmo objeto de conexão do banco de dados, e o código dessas operações está em diferentes classes de módulos.
As transferências bancárias incluem uma série de operações: reduza o saldo da transferência da conta e aumente o saldo da transferência para a conta. Operações de transferência O código é o método de dois objetos de conta diferentes.
Por exemplo, o ActionContext do STRUT2, quando o mesmo código é chamado e executado por threads diferentes, os dados operados por este código são o status e os dados de cada encadeamento Um thread, não importa quantas vezes que chama o método getContext e o método getContext em qual módulo em que o módulo é o mesmo.
Casos experimentais: Defina uma variável ThreadLocal que é compartilhada global e inicie vários threads para armazenar um valor aleatório na variável Threadlocal e, em seguida, chama os outros métodos múltiplos de várias outras categorias , você pode ver que várias classes compartilham os mesmos dados no mesmo thread.
Para encapsular a variável Threadlocal, para que o mundo exterior não opere diretamente a variável Threadlocal.
Este aplicativo é relativamente raro para a embalagem de tipos básicos de dados.
A embalagem dos dados do tipo de objeto é mais comum, ou seja, que uma determinada classe crie um objeto de instância independente para diferentes encadeamentos.
pacote com.ljq.test.thread; Forneça um objeto de instância. <2; Dados X. "Nome" + Dados); o método correspondente classe estática A {public void get () {int data = x.get (); ); .getage ()); "," + mydata.getage ());}} // use o método correspondente da classe B {public void get () {int data = x .get (); .Currenthread (). GetMydata: " + mydata.getName () +", " + mydata.getage ()); rivate mythreadscopedata () {} // fornece um método de instância. Não adicione as palavras -chave sincronizadas para indicar que os threads tomam seus próprios dados, e não interferem entre si. os dados definidos no intervalo de encadeamento atual do threadlocal .Name = nome;} public int getage () {Retornar Age;} public void Setage (int Age) {this.age = Age;}}}