Se seu código está em um processo que tem várias threads rodando ao mesmo tempo, pode estar rodando o código ao mesmo tempo. Se o resultado de cada execução for o mesmo de uma única thread, e os valores das outras variáveis forem os mesmos esperados, ela é segura contra threads. Em outras palavras, a interface fornecida por uma classe ou programa é atômica para threads ou a troca entre múltiplas threads não leva à ambiguidade no resultado da execução da interface, o que significa que não precisamos considerar a sincronização. Problemas de segurança de threads são causados tanto por variáveis globais quanto estáticas. Se cada thread tiver apenas operações de leitura para variáveis globais e estáticas, mas não operações de escrita, de modo geral, essa variável global é segura para threads; Se múltiplas threads realizarem operações de leitura e escrita em uma variável ao mesmo tempo, a sincronização de threads geralmente é necessária, caso contrário pode afetar a segurança da thread.
O objetivo do lock é impedir operações concorrentes quando a execução multithread é feita por várias threads, e objetos do tipo de referência de lock permitem que apenas uma thread opere por vez em sua área travada.
O lock só pode bloquear uma variável do tipo de referência, ou seja, bloquear um endereço
Há uma diferença entre os resultados de rodar com e sem travamento:
Após o travamento: o valor de i diminuirá um a um, não haverá saltos, nem saídas repetidas, até o valor de 0;
Sem bloqueio: o valor de saída de i vai saltar, descontínuo decrescente, e também pode ter um valor de saída de -1;
Motivo: Após adicionar um bloqueio, apenas uma thread pode executar o código na área travada por vez, e ambas as threads são executadas em ordem, então não haverá saída interrompida. |