Colección de citas famosas - Slogan de motivación - Principios básicos de la implementación de la tecnología CAS

Principios básicos de la implementación de la tecnología CAS

Todos los amigos saben que en realidad no soy una operación atómica y que habrá problemas de seguridad en un entorno de subprocesos múltiples. Escribamos una demostración de prueba para verificar esta conclusión.

A través del pequeño ejemplo anterior, podemos encontrar que los resultados de cada cálculo están sesgados. ¿Por qué hay una desviación? Esto se debe a que JMM divide la memoria en memoria de trabajo y memoria principal. Nuestras operaciones se realizan en la memoria de trabajo y luego los valores obtenidos se sincronizan con la memoria principal.

Podemos ver en la figura anterior que i = 0 está inicialmente en la memoria principal. En este momento, el hilo A lee I en la memoria de trabajo e inicia la operación i, y luego sincroniza el resultado de la operación i. =1 a la memoria principal. Sin embargo, dado que todo el proceso no es atómico (durante la operación del subproceso A, el subproceso B también puede realizar operaciones), antes de que el subproceso A pueda devolver el valor calculado a la memoria principal, el subproceso B comienza a ejecutar la operación i y el subproceso B El valor de Obtuve es 0 en lugar de 1 calculado por el hilo A, por lo que el resultado obtenido por el hilo B después de la operación es 1, lo que lleva a la siguiente situación.

1. Bloqueo de sincronización

Cuando agregamos un bloqueo de sincronización a i, podemos asegurarnos de que sea atómico, asegurando así que solo un subproceso pueda realizar operaciones en I al mismo tiempo. , Garantizando así la seguridad del hilo.

Después de pasar el bloqueo de sincronización, el resultado es consistente con el resultado esperado. Los principios básicos de la sincronización no son el tema central de este artículo y se analizarán en un artículo separado más adelante.

2. A través de AtomicInteger bajo el paquete de software J.U.C.

Está bien, he preparado mucho antes, ahora presentaré oficialmente el enfoque de este artículo: CAS, AtomicInteger se implementa en base a la tecnología CAS.

CAS, Compare y Swap se comparan y reemplazan. Ésta es una forma de implementar la idea del bloqueo optimista.

En la imagen podemos ver el principio de implementación de CAS: CAS tiene tres operandos: valor de memoria V, valor esperado antiguo A y valor a modificar B. Si y solo si el valor esperado A y la memoria Cuando el Los valores V son iguales, modifica el valor de la memoria a B y devuelve verdadero, de lo contrario no haces nada y devuelve falso.

1. Haga clic en el método getAndIncrement(), encontraremos que AtomicInteger llama al método getAndInt() de Unsafe.

Poco conocimiento: JVM es una especificación y actualmente existen cuatro implementaciones principales en el mercado.

Puntos calientes: la implementación de jvm más utilizada

2) JRocket: JRocket es la JVM de BEA. Los usuarios de WebLogic suelen utilizar la máquina virtual JRocket.

3) J9: JVM de IBM.

4) Harmony: una JVM de código abierto desarrollada conjuntamente por IBM e Intel JVM. IBM toma la delantera e Intel es la fuerza principal.

Busque atomic_linux_x86.inline.hpp y busque el método cmpxchg.

CAS es un tipo de bloqueo optimista que utiliza el giro para esperar a que otros subprocesos completen su trabajo. Desempeñarse bien en escenarios de tareas con poca competencia y tiempos de espera cortos.

1) Porque CAS adopta el modo de giro y el giro consume recursos de la CPU.

2) Sólo se pueden conservar las operaciones atómicas de una variable.

3) Problema del ácido abscísico

Aquí les explicaré a mis amigos qué es ABA, o tomaré el diagrama de flujo de CAS como ejemplo.

Como se mencionó anteriormente, aunque CAS ocupará recursos de la CPU, solo puede completar el proceso de bloqueo en modo de usuario (el modo kernel no está involucrado). Entonces, el escenario con pocos subprocesos, menos competencia y un tiempo de espera corto es el mejor escenario para CAS. ¿Han llegado tus amigos?