Un artículo te lleva a conocer los candados optimistas y pesimistas necesarios para las entrevistas.

Inserte la descripción de la imagen aquí

¿Qué es el bloqueo pesimista y el bloqueo optimista?

El candado optimista corresponde a las personas optimistas en la vida que siempre piensan en que las cosas van bien, y el candado pesimista corresponde a las personas pesimistas en la vida que siempre piensan en que las cosas van mal. Estos dos tipos de personas tienen sus propias ventajas y desventajas, y un tipo de persona es mejor que el otro según la escena.

Bloqueo pesimista

Siempre asume el peor de los casos.Cada vez que obtienes los datos, crees que otros los modificarán, por lo que cada vez que obtengas los datos, los bloquearás, de modo que otros que quieran obtener los datos los bloquearán hasta que obtenga el bloqueo (recurso compartido Solo lo usa un subproceso a la vez, otros subprocesos se bloquean y los recursos se transfieren a otros subprocesos después de su uso). Muchos de estos mecanismos de bloqueo se utilizan en bases de datos relacionales tradicionales, como bloqueos de filas, bloqueos de tablas, etc., bloqueos de lectura, bloqueos de escritura, etc., que están todos bloqueados antes de las operaciones. Los bloqueos exclusivos como sincronizados y ReentrantLock en Java son la realización de la idea de bloqueo pesimista.

Cerradura optimista

Asumir siempre la mejor situación. Cada vez que obtengo los datos, creo que otros no los modificarán, por lo que no se bloqueará, pero al actualizar, se juzgará si otros han actualizado los datos durante este período, y se puede utilizar la versión. Implementación de mecanismo numérico y algoritmo CAS. El bloqueo optimista es adecuado para tipos de aplicaciones de lectura múltiple, lo que puede mejorar el rendimiento El mecanismo de condición de escritura similar a la condición de escritura proporcionada por la base de datos es en realidad el bloqueo optimista proporcionado. En Java, la clase de variable atómica del paquete java.util.concurrent.atomic se implementa mediante CAS, una implementación de bloqueo optimista.

También hay varios módulos de puntos de conocimiento para organizar documentos y más preguntas de entrevistas reales de las principales fábricas. Los amigos que lo necesiten pueden hacer clic en el enlace a continuación para obtenerlos gratis

Enlace: 1103806531 Contraseña: CSDN

Inserte la descripción de la imagen aquí

Utilice escenarios de dos cerraduras

De la introducción anterior de los dos bloqueos, sabemos que los dos bloqueos tienen sus propias ventajas y desventajas. Uno no puede considerarse mejor que el otro. Por ejemplo, los bloqueos optimistas son adecuados para menos escrituras (leer más escenarios), es decir, los conflictos son verdaderos. Cuando esto sucede con poca frecuencia, esto ahorra la sobrecarga de la cerradura y aumenta el rendimiento general del sistema. Sin embargo, si se sobreescribe, los conflictos suelen ocurrir con frecuencia, lo que provocará que la aplicación de nivel superior vuelva a intentarlo constantemente, lo que reducirá el rendimiento, por lo que es más apropiado utilizar el bloqueo pesimista en el escenario de sobreescritura.

Dos implementaciones comunes de bloqueo optimista

El bloqueo optimista generalmente se implementa mediante el mecanismo de número de versión o el algoritmo CAS.

1. Mecanismo de número de versión

Generalmente, se agrega un campo de versión de número de versión de datos a la tabla de datos, que indica el número de veces que se han modificado los datos. Cuando se modifican los datos, el valor de la versión aumentará en uno. Cuando el hilo A quiere actualizar el valor de los datos, también leerá el valor de la versión mientras lee los datos. Al enviar la actualización, si el valor de la versión recién leído es igual al valor de la versión en la base de datos actual, se actualizará; de lo contrario, intente nuevamente Actualización de la operación hasta que la actualización sea exitosa.

Da un ejemplo simple:

Suponiendo que hay 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 de saldo de la cuenta actual (saldo) es $ 100.

El operador A lo lee en voz alta (versión = 1) y deduce $ 50 ($ 100- $ 50) del saldo de su cuenta.
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.
El operador A completa el trabajo de modificación y agrega uno al número de versión de los datos (versión = 2), junto con el saldo de la cuenta (saldo = $ 50), y lo envía a la base de datos para su actualización. En este momento, debido a que la versión de los datos enviados es mayor que la versión actual del registro de la base de datos, los datos son Actualizar, la versión del registro de la base de datos se actualiza a 2.
El operador B completó la operación y también aumentó el número de versión en uno (versión = 2) e intentó enviar datos 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 datos enviado por el operador B era 2 , La versión actual del registro de la base de datos también es 2, la cual no cumple con la estrategia de bloqueo optimista de "la versión enviada debe ser mayor que la versión actual del registro para realizar la actualización", por lo que se rechaza el envío del operador B.

De esta forma, se evita que el operador B sobrescriba el resultado de la operación del operador A con el resultado de la modificación de datos antiguos basada en la versión = 1.

2. Algoritmo CAS

A saber, comparar e intercambiar (comparar e intercambiar), es un conocido algoritmo sin bloqueo. Programación sin bloqueo, es decir, para lograr una sincronización variable entre múltiples subprocesos sin utilizar bloqueos, es decir, para lograr una sincronización variable sin que se bloqueen los subprocesos, por lo que también se le llama sincronización sin bloqueo (Sincronización sin bloqueo).

El algoritmo CAS involucra tres operandos

  • Necesita leer y escribir el valor de memoria V
  • El valor para comparar A
  • Nuevo valor por escribir B

Si y solo si el valor de V es igual a A, CAS actualiza atómicamente el valor de V con el nuevo valor B, de lo contrario no realizará ninguna operación (la comparación y reemplazo es una operación atómica). En circunstancias normales, es una operación de giro, es decir, un reintento constante.

Desventajas del bloqueo optimista

El problema de ABA es un problema común con el bloqueo optimista

1 problema de ABA

Si una variable V es el valor de A cuando se lee por primera vez, y se comprueba que sigue siendo el valor de A cuando está lista para ser asignada, ¿podemos demostrar que su valor no ha sido modificado por otros hilos? Obviamente no puede, porque durante este tiempo su valor puede cambiarse a otro valor, y luego cambiarse de nuevo a A, entonces la operación CAS creerá erróneamente que nunca se ha modificado. Este problema se denomina problema "ABA" del funcionamiento de CAS.

La clase AtomicStampedReference posterior a JDK 1.5 proporciona esta capacidad. El método compareAndSet primero verifica si la referencia actual es igual a la referencia esperada y si la bandera actual es igual a la bandera esperada. Si todas son iguales, la referencia y la bandera son atómicas El valor se establece en el valor de actualización dado.

2 Tiempo de ciclo largo y gastos generales elevados

Spin CAS (es decir, se ejecutará en un bucle hasta que tenga éxito) si no tiene éxito durante mucho tiempo, traerá una sobrecarga de ejecución muy grande a la CPU. Si la JVM puede soportar la instrucción de pausa proporcionada por el procesador, entonces la eficiencia mejorará. La instrucción de pausa tiene dos funciones. Primero, puede retrasar la ejecución de las instrucciones para que la CPU no consuma demasiados recursos de ejecución. El tiempo de demora depende de la versión de implementación específica y el tiempo de demora es cero en algunos procesadores. En segundo lugar, puede evitar el vaciado de la tubería de la CPU causado por la violación del orden de memoria al salir del bucle, mejorando así la eficiencia de ejecución de la CPU.

3 Solo se puede garantizar el funcionamiento atómico de una variable compartida

CAS solo es válido para una única variable compartida. CAS no es válido cuando la operación involucra múltiples variables compartidas. Pero desde JDK 1.5, la clase AtomicReference se proporciona para garantizar la atomicidad entre los objetos referenciados. Puede poner varias variables en un objeto para las operaciones CAS. Por lo tanto, podemos usar bloqueos o usar la clase AtomicReference para compartir múltiples variables compartidas Fusionar en una variable compartida para operar.

Utilice escenarios de CAS y sincronizados

En pocas palabras, CAS es adecuado para menos escrituras (más escenarios de lectura, generalmente menos conflictos), sincronizado es adecuado para más escrituras (más escenarios de escritura, más conflictos en general)

En el caso de menos competencia de recursos (conflictos de subprocesos leves), el uso de bloqueos de sincronización sincronizados para el bloqueo de subprocesos y el cambio de activación, así como las operaciones de cambio entre el modo de usuario y el modo de kernel desperdician recursos de la CPU; CAS se basa en hardware y no necesita ingresar al kernel. No hay necesidad de cambiar de hilo, y la posibilidad de operar el giro es menor, por lo que se puede obtener un mayor rendimiento.
En el caso de una competencia de recursos grave (conflicto de subprocesos grave), la probabilidad de que CAS gire es relativamente grande, lo que desperdicia más recursos de CPU y es menos eficiente que la sincronización.

Suplemento: La palabra clave sincronizada en el campo de la programación concurrente de Java siempre ha sido un rol veterano, hace mucho tiempo, mucha gente lo llamaba un "bloqueo de peso pesado". Sin embargo, después de JavaSE 1.6, se ha incluido principalmente para reducir el consumo de rendimiento de la adquisición y liberación de bloqueos, y la introducción de bloqueos de polarización y bloqueos ligeros, así como varias otras optimizaciones, se ha vuelto menos importante en algunos casos. . La implementación subyacente de sincronizados se basa principalmente en colas sin bloqueo. La idea básica es bloquear tras giro y continuar compitiendo por bloqueos después del cambio competitivo, lo que sacrifica ligeramente la equidad, pero logra un alto rendimiento. En el caso de menos conflictos de subprocesos, se puede obtener un rendimiento similar a CAS; y en el caso de conflictos de subprocesos graves, el rendimiento es mucho mayor que CAS.

para resumir

Debido a limitaciones de tiempo, no está escrito en detalle, y los amigos que necesitan la versión completa pueden hacer clic en el enlace de abajo para obtenerla gratis.

Enlace: 1103806531 Contraseña: CSDN

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_48655626/article/details/109097217
Recomendado
Clasificación