Escenarios comunes de mal uso: Para evitar pagos duplicados de pedidos causados por usuarios que accidentalmente pulsan el botón de pago varias veces, usamos el bloqueo (número de pedido) para asegurarnos de que solo un hilo pueda realizar la operación en el pedido.
Esta idea es buena, al menos mejor que el lock (un objeto estático privado para procesar clases), porque el efecto del número de orden de bloqueo es bloquear solo la operación del orden actual 1, y si la variable estática de bloqueo, es decir, bloquear todas las órdenes, hará que todas las órdenes se pongan en cola, lo cual es obviamente irrazonable.
¿Puede el método del candado (número de pedido) mencionado al principio de este artículo lograr el efecto deseado? Vamos a usar algo de código para restaurar el escenario de uso primero.
Si ignoras la información del usuario y otras validaciones, el código se ve más o menos así:
Para la palabra clave de candado, MSDN incluye información que se puede encontrar en Baidu, y parece que se recomienda no usar lock (string), y la razón es la misma. El siguiente pasaje está tomado del consejo de MSDN sobre las cuerdas de los candados:
El problema del lock("miLock") ocurre porque cualquier otro código que use la misma cadena en el proceso compartirá el mismo bloqueo. Esta frase oculta un mecanismo enorme, es decir, "la misma cadena".
¿Qué es "la misma cuerda"? Consulta el código:
¿Son str1 y str2 la misma cuerda de arriba? La respuesta es SÍ.
Ver de nuevo:
¿Siguen siendo la fuerza 1 y la 2 superior la misma cuerda? La respuesta es NO.
Vale, volvamos al tema del pago del pedido. En nuestro código, lock(orderNumber), cuando el usuario hace clic accidentalmente unas cuantas veces más tras deslizar la mano, ¿el número de orden que introduce esta acción es la misma cadena cada vez? La respuesta es NO. Esto es decir
El código que gestiona el pedido anterior no actúa realmente como un bloqueo.
De hecho, existen dos tipos de comparaciones de cadenas, véase el código:
La primera línea del código anterior genera True, y la segunda línea produce False. Creo que entiendes lo que MSDN significa con "la misma cadena" sin que yo te explique.
La mejor solución
Soluciones para cuerdas de bloqueo óptimas:
Código de demostración:
En la web, a veces se puede usar una variable global; esta variable global, cuando varios usuarios acceden al mismo tiempo, puede parecer anormal; en este momento, establecemos un bloqueo global, pero la desventaja es que todos los accesos esperarán por turnos.
En algunos casos, por ejemplo, el mismo usuario solo puede comentar una vez en 15 segundos; si se usa el bloqueo global, la función de comentarios será muy lenta de procesar cuando el número de usuarios aumente, lo que afectará mucho a la experiencia del usuario.
En este momento,Podemos establecer el bloqueo para cada usuario individualmente, lock(string){...}, y el nombre del lock puede definirse como:Nombre del método + ID de usuarioDe este modo, cada usuario tiene un bloqueo independiente y, al juzgar el intervalo de comentarios, no afectará a los comentarios de otros usuarios.
(Fin)
|