entrevista Jave con el principio subyacente de CAS

Buenos hermanos, ¿alguien realmente leer CAS, ¿verdad? De todos modos, yo no entendía ...

A. Lo que CAS?

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 1. CAS是什么? => compareAndSet 比较并交换
 */
public class CASTest {

    public static void main(String[] args) {

        AtomicInteger atomicInteger=new AtomicInteger(5);

        System.out.println(atomicInteger.compareAndSet(5,2019)+"\t "+"currentData: "+atomicInteger.get());

        System.out.println(atomicInteger.compareAndSet(5,2020)+"\t "+"currentData: "+atomicInteger.get());
    }
}

la figura del profesor Zhou Yang se dibuja Sao ~

Aquí Insertar imagen Descripción
¿Cómo quiere decir que

  • Al principio, establezca el valor en la memoria física principal 5
  • Un primer hilo, la memoria de comparación y el intercambio torreón, las expectativas de hilos es 5, y el valor es sólo la memoria 5, y luego el valor de cambio, es decir, el valor de la memoria física primaria 5 a 2019 y luego devuelve una representativa del valor verdadero y el valor esperado tomado es el mismo
  • A continuación, comunique al otro hilo visible, el segundo hilo, y se encontró que la memoria física principal es 2019, con sus diferentes expectativas 5 ah, y luego regresó una falsa, la memoria física principal no ha cambiado ~ .

. Dos CAS principio subyacente

En primer lugar, vamos a echar un vistazo a atomicInteger.getAndIncrement () ¿Por qué no añadir sincronizado se puede mantener en un hilo de seguridad multi-roscado
Aquí Insertar imagen Descripción
punto de abrir, encontramos una clase insegura, insegura CAS es la clases principales

  • 1. inseguro
    es clases básicas CAS, ya que el método no puede acceder directamente al sistema Java subyacente, necesita ser visitada por el método local (nativo), el inseguro equivalente - una puerta trasera, en base a datos de un específico tal memoria puede ser manipulado directamente. existe la clase sun.misc inseguro en el paquete, que puede ser un método de funcionamiento de una imagen interna del puntero C - como el funcionamiento de la memoria directa, ya que el CAS es inseguro en las clases principales de Java, ya que el método no puede acceder directamente al sistema de Java subyacente, la necesidad local (nativo ) acceder método, el inseguro equivalente a una puerta trasera, los datos basados en tal memoria un específico puede ser manipulado directamente. existe clase sun.misc inseguro en el paquete , que puede ser método interno de operar el mismo que el puntero de memoria operación directamente a la C , debido a que el método se basa en la ejecución de las clases de Java operación insegura en el CAS. Tenga en cuenta que todos los métodos de la clase en condiciones de riesgo son modificados nativo, esa clase inseguro método son llamadas directas a los recursos del sistema operativo subyacente para llevar a cabo la tarea apropiada

Tenga en cuenta que todos los métodos de la clase en condiciones de riesgo son modificados nativo, esa clase inseguro método son llamadas directas a los recursos del sistema operativo subyacente para llevar a cabo la tarea apropiada

  • 2. variable de valueOffset , el valor de la variable indica que la memoria de direcciones de desplazamiento , como es inseguro La dirección de desplazamiento de la memoria para obtener los datos.

  • ** 3. Valor de variable con volátil modificado para garantizar la visibilidad de la memoria entre varios subprocesos.
    **

2.1 inferior CAS

Nombre completo de comparación y de intercambio de CAS, que es un - de primitivas CPU de concurrencia.

Su función es determinar si una ubicación de memoria del valor del valor esperado, y si cambia a un nuevo valor, el proceso es átomos.

primitivas de concurrencia CAS refleja en el lenguaje Java es la clase sun.misc.Unsafe de cada método. Método CAS llama clase UnSafe, JVM nos ayudará a lograr un instrucciones de montaje CAS . Esta es una función dependiente del hardware del todo, a través del cual implementa la operación atómica . Una vez más, ya que el CAS es un sistema primitivo, parte de la categoría primitivas del sistema operativo lenguaje está compuesto por una serie de instrucciones para un proceso de completar una determinada función, y realiza primitivas debe ser continua , en el proceso de implementación no sea interrumpido, que CAS es una CPU de instrucciones atómicas , no va a hacer que los llamados inconsistencias en los datos.

Aquí Insertar imagen Descripción
En primer lugar, var1 en nombre del objeto actual, objeto var2 que representa la dirección de desplazamiento, var4 que es el valor de 1, entonces getIntVolatile () para obtener el valor del objeto actual es cuánto ahorrar lo VAR5, a continuación, después de una será, entonces este método para comparar el valor actual de la compareAndSwapInt objeto () o no var5, a continuación, dar a este un valor de 1, de vuelta verdad, mientras que el interior es falso el bucle termina, y devuelve un valor de 1. Si el objeto actual no antes de var5, y devuelve una falsa, mientras que en el interior del bucle es verdadera, el bucle continúa para obtener el siguiente valor a comparar, hasta que más éxito -

Bueno ... no ha terminado todavía, mañana es!

Publicado 84 artículos originales · ganado elogios 72 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/kingtok/article/details/105058823
Recomendado
Clasificación