Uno de los errores nerviosos cometidos por los recién graduados de 2023 en la entrevista de Java: CAS dijo erróneamente que era un candado feliz, lo que hizo reír al entrevistador.

Fuente: Red XX, si se siente ofendido, discúlpese.

Entrevistador: ¿Qué es CAS?

Yo: Este es un candado simple y feliz.

Entrevistador: ¿Qué carajo?

Yo: Cara de confianza, sí, esto es todo.

Entrevistador: Riendo a carcajadas, jaja ~, regresa y espera la notificación.

Yo: ¿WFT? ¿Qué te ríes?

Público: Esta misma tarde fui rechazado y ustedes me sanaron instantáneamente. . La depresión se ha curado

Significado de CAS:

comparar e intercambiar, traducido como comparar y reemplazar. Dirección de memoria V, antiguo valor esperado A, nuevo valor a modificar B. Comúnmente conocido como: bloqueo optimista

Entonces, ¿cuál es la definición de bloqueo optimista? :

El bloqueo optimista mantiene una actitud optimista hacia los conflictos de datos. Al operar datos, los datos operados no se bloquearán (esto permite que múltiples tareas operen en los datos en paralelo), y solo a través de un mecanismo cuando se envían los datos. Para verificar si hay hay un conflicto en los datos (el método de implementación general es agregar el número de versión y luego comparar el número de versión);

Es esencialmente un conjunto de instrucciones de la CPU que puede proporcionar una operación. Esta operación es un bucle for continuo. Esta instrucción se utiliza para obtener la dirección de una determinada memoria. Si se obtiene, significa que se obtiene el bloqueo. .

Tomemos un ejemplo del método en AtomicInteger en el código fuente subyacente:

Es una operación de bucle do while. Aquí hay 2 operaciones.

1. v = getIntVolatile(o, desplazamiento):

Se utiliza para obtener el valor entero correspondiente a la dirección de desplazamiento en el objeto. Entre ellos, o representa el objeto y el desplazamiento representa el desplazamiento. Este método devolverá el valor en la memoria compartida y controlará la visibilidad del valor a través de volátiles para garantizar que el valor obtenido de la memoria sea el último valor.

2. débilCompareAndSetInt(o, desplazamiento, v, v + delta)

Se utiliza para comparar valores en la memoria para ver si los valores anteriores son iguales. Si son iguales, escriba el valor modificado en la memoria y devuelva verdadero. Indica que la modificación fue exitosa.

Entre ellos, o representa el objeto, offset representa el desplazamiento, v y v+delta representan el valor esperado y el nuevo valor respectivamente (lo mismo significa que ningún otro subproceso modificará este valor durante este período). Este método es atómico, lo que significa que no será interrumpido por otros subprocesos durante la ejecución.

Su capa inferior es un método nativo:

Descripción en inglés:

Si la variable Java actualmente contiene el valor esperado, se actualiza automáticamente a x.
Esta operación tiene una semántica de memoria de lecturas y escrituras volátiles. Corresponde a C11 atomic_compare_exchange_strong (C++).
Devolución:
verdadero si tiene éxito

Escribió una demostración:

1. Simplemente agregue uno y compare el valor esperado con el valor real.

2. Deje que dos hilos compitan por el trabajo.

Qué problemas surgirán con CAS:

1. Sí, es el problema ABA en el que estás pensando.

Solución: utilice el número de versión y compare la marca de tiempo/número de versión cada vez que compare e intercambie.

2. Implementación subyacente: si la operación while no se puede realizar, continuará en bucle. Si se repite durante mucho tiempo, la CPU estará inactiva y consumirá recursos.

Solución: Necesidad de controlar el número de giros.

3. Solo puede garantizar el funcionamiento atómico de una variable, pero no la atomicidad de un bloque de código.

Supongo que te gusta

Origin blog.csdn.net/weixin_42450130/article/details/132643331
Recomendado
Clasificación