Cenários comuns de uso indevido: Para evitar pagamentos duplicados de pedidos causados por usuários clicando acidentalmente no botão de pagamento várias vezes, usamos o lock (número do pedido) para garantir que apenas um fio fio possa realizar a operação no pedido.
Essa ideia é boa, pelo menos melhor que lock (um objeto estático privado para processamento de classes), porque o efeito do número de ordem de travamento é travar apenas a operação da ordem 1 atual, e se a variável estática de bloqueio for bloqueada para todas as ordens, fará com que todas as ordens fiquem em fila, o que é obviamente irrazoável.
Então, o método do número do pedido (lock) mencionado no início deste artigo pode alcançar o efeito desejado? Vamos usar um pouco de código para restaurar o cenário de uso primeiro.
Se você ignorar informações do usuário e outras validações, o código fica basicamente assim:
Para a palavra-chave lock, MSDN inclui informações que podem ser encontradas no Baidu, e parece que é recomendado não usar lock (string), e o motivo é o mesmo. O trecho a seguir é retirado do conselho da MSDN sobre cordões de fechadura:
O problema do lock ("meuLock") ocorre porque qualquer outro código usando a mesma string no processo compartilhará o mesmo lock. Essa frase esconde um mecanismo enorme, que é, "a mesma cadeia".
O que é "a mesma corda"? Veja o código:
Str1 e str2 são a mesma corda acima? A resposta é SIM.
Veja novamente:
Str1 e str2 acima ainda são a mesma corda? A resposta é NÃO.
Ok, vamos voltar à questão do pagamento do nosso pedido. No nosso código, lock(orderNumber), quando o usuário clica acidentalmente mais algumas vezes após passar a mão, o orderNumber que digita essa ação é a mesma cadeia a cada vez? A resposta é NÃO. Ou seja,
O código que lida com a ordem acima não funciona como um bloqueio.
Na verdade, existem dois tipos de comparações de strings, veja o código:
A primeira linha do código acima gera Verdadeiro, e a segunda linha gera Falso. Acredito que você entende o que MSDN quer dizer com "a mesma cadeia" sem minha explicação.
A melhor solução
Soluções para cadeias de travamento ótimas:
Código de demonstração:
No site, às vezes uma variável global pode ser usada; essa variável global, quando vários usuários acessam ao mesmo tempo, pode parecer anormal; nesse momento, vamos definir um bloqueio global, mas a desvantagem disso é que todos os acessos aguardam por turno.
Em alguns cenários, por exemplo, o mesmo usuário só pode comentar uma vez em 15 segundos; se o bloqueio global for usado, a função de comentário será muito lenta para processar quando o número de usuários aumentar, o que afetará muito a experiência do usuário.
Neste momento,Podemos definir o bloqueio para cada usuário individualmente, lock(string){...}, e o nome do lock pode ser definido como:Nome do método + ID do usuárioDessa forma, cada usuário tem um bloqueio independente e, ao avaliar o intervalo de comentários, ele não afetará os comentários dos outros usuários.
(Fim)
|