Bloqueo pesimista y bloqueo optimista en java

En la entrevista reciente, el entrevistador mencionó bloqueos pesimistas y optimistas. Creo que la respuesta no es muy buena. Resuma los registros. En
términos simples, los bloqueos pesimistas piensan que ocurrirá lo peor en todas las cosas, y los bloqueos optimistas piensan que todo es lo mejor. El desarrollo de una buena situación corresponde a lo negativo y a lo positivo.

Cerradura pesimista

Tiene fuertes características exclusivas y exclusivas. Se refiere a la actitud conservadora de que los datos son modificados por el mundo exterior (incluidas las otras transacciones actuales del sistema y el procesamiento de transacciones desde sistemas externos). Por lo tanto, los datos se bloquean durante todo el proceso de procesamiento de datos. (De la Enciclopedia Baidu)
Muchos bloqueos en bases de datos relacionales tradicionales usan este mecanismo, como bloqueos de fila, bloqueos de tabla, bloqueos de lectura, bloqueos de escritura, etc., que se bloquean antes de realizar operaciones. Los bloqueos reentrantes como sincronizar y ReentrantLock en Java son mecanismos utilizados;

Bloqueo optimista

Siempre pienso que no habrá problemas de concurrencia. Cada vez que busco datos, siempre pienso que ningún otro hilo modificará los datos, por lo que no se bloqueará, pero al actualizar, juzgará si otros hilos han hecho datos antes. Las modificaciones generalmente se implementan utilizando mecanismos de número de versión u operaciones CAS. Los bloqueos optimistas son adecuados para los tipos de aplicaciones de lectura múltiple, que pueden mejorar el rendimiento. Al igual que el mecanismo write_condition proporcionado por la base de datos, en realidad son bloqueos optimistas. En Java, la clase de variable atómica bajo el paquete java.util.concurrent.atomic usa CAS, una implementación de bloqueo optimista.

Dos formas de implementar un bloqueo optimista:

1. Mecanismo de número de versión

Es decir, agregar un identificador de versión a los datos. En la solución de versión basada en la tabla de la base de datos, generalmente se logra agregando un campo de "versión" a la tabla de la base de datos. Cuando lea los datos, lea juntos este número de versión, y luego actualice, agregue uno a este número de versión. En este momento, los datos de la versión de los datos enviados se comparan con la información de la versión actual del registro correspondiente de la tabla de la base de datos, y si el número de versión de los datos enviados es mayor que el número de la versión actual de la tabla de la base de datos, se actualiza; de lo contrario, se considera que son datos caducados. Lo siguiente se explica con una imagen:

Un sistema operativo bancario, suponiendo que haya un campo de versión en la tabla de información de la cuenta en la base de datos, el valor actual es 1; y el campo del saldo de la cuenta corriente (saldo) es $ 100.

  1. El operador A ahora lo lee (versión = 1) y deduce $ 50 ($ 100- $ 50) del saldo de su cuenta.
  2. Durante la operación del operador A, el operador B también lee esta información del usuario (versión = 1) y deduce $ 20 ($ 100- $ 20) del saldo de su cuenta.
  3. El operador A completa el trabajo de modificación, envía los datos con la versión = 1 y el saldo después de la deducción de la cuenta (saldo = $ 50) a la base de datos para su actualización, en este momento, los datos se actualizan porque la versión de los datos enviados es igual a la versión actual del registro de la base de datos y la versión del registro de la base de datos Actualice a 2 (setversion = versión + 1 wheresion = 1).
  4. El operador B completó la operación de ingreso de datos y también trató de enviar los datos con la versión = 1 a la base de datos (saldo = $ 80), pero en este momento al comparar la versión del registro de la base de datos, se encontró que el número de versión de los datos enviados por el operador B era 1, el registro de la base de datos La versión actual también es 2, lo que no satisface la estrategia de bloqueo optimista de "la versión presentada debe ser igual al registro de la versión actual para realizar la actualización". Por lo tanto, se rechaza la presentación del operador B.

De esta manera, se evita la posibilidad de que el operador B sobrescriba el resultado de la operación del operador A con el resultado de una modificación de datos anterior basada en la versión = 1.
Inserte la descripción de la imagen aquí

2. algoritmo CAS

Compare and swap (compare and swap) es un famoso algoritmo sin bloqueo. Programación sin bloqueo, es decir, sincronización de variables entre múltiples hilos sin usar bloqueos, es decir, sincronización de variables sin hilos bloqueados, por lo que también se llama sincronización sin bloqueo (Sin sincronización sin bloqueo). El algoritmo CAS involucra tres operandos

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

Si y solo si el valor de V es igual a A, CAS usa el valor atómico para actualizar el valor de V, de lo contrario no se realizará ninguna operación (comparar y reemplazar es una operación atómica). En general, es una operación de rotación, es decir, reintento continuo. El seguimiento específico continuará siendo una comprensión profunda, que ahora solo se menciona brevemente.

Publicación de blog de referencia:
enlace original: https://blog.csdn.net/qq_34337272/article/details/81072874
Enlace original: https://blog.csdn.net/L_BestCoder/article/details/79298417

Publicado 39 artículos originales · ganado elogios 1 · vistas 4620

Supongo que te gusta

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