Bloqueio pessimista e bloqueio otimista em java

Na entrevista recente, o entrevistador mencionou bloqueios pessimistas e otimistas. Sinto que a resposta não é muito boa. Resuma os registros. Em
termos simples, os bloqueios pessimistas pensam que o pior ocorrerá em tudo e os bloqueios otimistas pensam que tudo é o mais O desenvolvimento de uma boa situação corresponde a um negativo e um positivo.

Bloqueio pessimista

Tem fortes características exclusivas e exclusivas. Refere-se à atitude conservadora de que os dados são modificados pelo mundo exterior (incluindo as outras transações atuais do sistema e o processamento de transações de sistemas externos). Portanto, os dados são bloqueados durante todo o processo de processamento de dados. (Da Enciclopédia Baidu)
Muitos bloqueios nos bancos de dados relacionais tradicionais usam esse mecanismo, como bloqueios de linha, bloqueios de tabela, bloqueios de leitura, bloqueios de gravação etc., que são bloqueados antes de executar operações. Bloqueios de reentrada, como sincronizar e ReentrantLock em Java, são esses mecanismos usados;

Bloqueio otimista

Eu sempre acho que não haverá problemas de simultaneidade. Toda vez que busco dados, sempre penso que nenhum outro thread modifica os dados, para que não sejam bloqueados, mas ao atualizar, ele julgará se outros threads já fizeram dados antes. As modificações geralmente são implementadas usando mecanismos de número de versão ou operações CAS. Os bloqueios otimistas são adequados para tipos de aplicativos com várias leituras, o que pode melhorar a taxa de transferência.Como o mecanismo write_condition fornecido pelo banco de dados, eles são realmente bloqueios otimistas. Em Java, a classe de variável atômica no pacote java.util.concurrent.atomic usa o CAS, uma implementação de bloqueio otimista.

Duas maneiras de implementar o bloqueio otimista:

1. Mecanismo do número da versão

Isso significa adicionar um identificador de versão aos dados.Na solução de versão baseada na tabela do banco de dados, isso geralmente é alcançado adicionando um campo "version" à tabela do banco de dados. Ao ler os dados, leia esse número da versão juntos e, posteriormente, atualize, adicione um ao número da versão. No momento, os dados da versão dos dados enviados são comparados com as informações da versão atual do registro correspondente da tabela do banco de dados e, se o número da versão dos dados enviados for maior que o número da versão atual da tabela do banco de dados, eles são atualizados, caso contrário, são considerados dados expirados. O seguinte é explicado com uma figura:

Um sistema operacional de banco, supondo que exista um campo de versão na tabela de informações da conta no banco de dados, o valor atual é 1 e o campo de saldo da conta atual (saldo) é de R $ 100.

  1. O operador A agora lê (versão = 1) e deduz $ 50 ($ 100 - $ 50) do saldo da sua conta.
  2. Durante a operação do operador A, o operador B também lê essas informações do usuário (versão = 1) e deduz US $ 20 (US $ 100 - US $ 20) do saldo da sua conta.
  3. O operador A conclui o trabalho de modificação, envia os dados com versão = 1 e o saldo após dedução da conta (saldo = US $ 50) para o banco de dados para atualização; nesse momento, os dados são atualizados porque a versão dos dados enviados é igual à versão atual do registro do banco de dados e a versão do registro do banco de dados Atualize para 2 (setversion = versão + 1 whereeversion = 1).
  4. O operador B concluiu a operação de entrada de dados e também tentou enviar os dados com a versão = 1 ao banco de dados (saldo = $ 80), mas, neste momento, ao comparar a versão do registro do banco de dados, verificou-se que o número da versão dos dados enviados pelo operador B era 1, o registro do banco de dados A versão atual também é 2, que não satisfaz a estratégia de bloqueio otimista de "a versão enviada deve ser igual ao registro da versão atual para executar a atualização". Portanto, a submissão do operador B é rejeitada.

Dessa maneira, evita-se a possibilidade do operador B sobrescrever o resultado da operação do operador A pelo resultado da modificação de dados antigos com base na versão = 1.
Insira a descrição da imagem aqui

2. Algoritmo CAS

Comparar e trocar (comparar e trocar) é um famoso algoritmo sem bloqueio. Programação sem bloqueio, ou seja, sincronização de variáveis ​​entre vários encadeamentos sem usar bloqueios, ou seja, sincronização de variáveis ​​sem encadeamento, sendo também chamada de sincronização sem bloqueio (Sincronização sem Bloqueio). O algoritmo CAS envolve três operandos

需要读写的内存值 V
进行比较的值 A
拟写入的新值 B

Se e somente se o valor de V for igual a A, o CAS usará o valor atômico para atualizar o valor de V; caso contrário, nenhuma operação será executada (comparar e substituir é uma operação atômica). Em geral, é uma operação de rotação, ou seja, repetição contínua. O acompanhamento específico continuará sendo aprofundado, agora apenas brevemente mencionado.

Postagem no blog de referência:
link original: https://blog.csdn.net/qq_34337272/article/details/81072874
Link original: https://blog.csdn.net/L_BestCoder/article/details/79298417

Publicado 39 artigos originais · ganhou elogios 1 · vista 4620

Acho que você gosta

Origin blog.csdn.net/thetimelyrain/article/details/100974565
Recomendado
Clasificación