comprensión CAS profundidad de mecanismo libre de bloqueo

1. Java modelo de memoria: JMM

  En el modelo de memoria que define una memoria principal, todas las variables de instancia declaradas están presentes en la memoria principal de ellos, la memoria principal de los datos serán compartidos con todos los temas, cada hilo tiene un bloque de memoria de trabajo, una copia de la memoria de trabajo entre los datos de memoria principal cuando actualización datos, los datos de la memoria de trabajo a la memoria principal, que está sincronizado;

2. ¿Qué es CAS 

  CAS: Comparar y de intercambio, de comparación es decir, el intercambio;

  jdk1.5 aumenta y java.util.concurrent contrato. *, que las siguientes clase implementa un algoritmo utilizando un CAS distinto del bloqueo optimista sincronizada bloqueo sincronizado. Antes del lenguaje java jdk1.5 está sincronizado por la palabra clave sincronizada para asegurar que este es un bloqueo exclusivo, es también el bloqueo pesimista;

comprensión algoritmo 3.CAS

  3.1 en comparación con las cerraduras, hacen uso de programas de intercambio aspecto relativamente más complicado. Sin embargo, debido a su no-bloqueo, interbloqueos su inmunidad innata, y la interacción entre los hilos es mucho más de forma basada en la cerradura menos; lo más importante, el uso de la forma libre de bloqueo para traer ninguna contención de bloqueo sobrecarga, no hay programación inter-hilo sobrecarga causada por frecuente, por lo tanto, tiene un mejor rendimiento que forma a base de cerradura;

  3.2 beneficios libres de bloqueo:

    3.2.1 En el caso de alta concurrencia, que tiene un mejor rendimiento que el programa tiene cerraduras;

    3.2.2 Se inherentemente interbloqueo inmunidad;

  3.3 CAS proceso algoritmo:

    Contiene tres parámetros CAS (V, E, N): V representa las variables actualizados, E es el valor esperado, N representa el nuevo valor;    

    3.3.1 subprocesos tienen acceso a los datos en la memoria principal se sincronizarán con la memoria de trabajo entre los hilos
    3.3.2 suponen hilo A y el hilo B tiene los cambios de datos, por lo que si el hilo Un primer obtener permiso para ejecutar
    3.3.3 una primera rosca comparará si los datos entre la memoria de trabajo y la memoria principal de entre los mismos, si son consistentes (V == e) se actualiza, los datos no coinciden, refresco, reciclado determinó
    3.3.4 hora actualizada, hilo B datos también debe ser actualizada, los datos principales datos de la memoria y de la memoria de trabajo hacen la comparación, si la misma se va a actualizar, datos inconsistentes serán memoria principal re-actualización en la memoria de trabajo y memoria de datos en dos ciclos de nuevo hasta la misma comparación de fechas

 

3.4 CAS operaciones se llevan a cabo espera una actitud optimista, que siempre cree que puede completar con éxito la operación, cuando varios subprocesos de manera simultánea utilizando un software matemático que operan las variables, sólo uno va a ganar, y actualizado correctamente, y el resto se producirá un error; fallan no se suspende hilo, sólo para decir que falló y permitió volver a intentarlo, por supuesto, permitir que fracase hilo abortar la operación, sobre la base de este principio, CAS operando incluso si no hay bloqueo, otros temas también se pueden encontrar en la interferencia de rosca actual y procesarla adecuadamente;

  3.5 En pocas palabras, el CAS se requiere para dar una expectativas adicionales, es decir, se piensa que esta variable debe parecerse; si la variable no es lo que usted se imagina, significa que se ha modificado en los demás, hay que releer tomar, una vez más, intenta modificar similares;

  3,6 a nivel de hardware, la mayoría de los procesadores modernos ya son compatibles con la instrucción CAS atómica, después de jdk1.5, la máquina virtual puede utilizar este comando para lograr un funcionamiento concurrente y estructuras de datos concurrentes, y una operación de este tipo en una máquina virtual se puede decir que estar en todas partes;

deficiencias 4.CAS

  CAS hay un problema obvio, a saber problema ABA;

  Pregunta: Si la variable V cuando la lectura inicial es A, y los cheques a la asignación en el momento de la preparación de cualquier supuesto, es A, que puede explicar su valor no se ha revisado todavía otro hilo?

  Si B se había cambiado durante este tiempo, entonces no volver a A, que la operación CAS por error la tarea nunca se ha modificado. N esta situación, átomos de aplicación Java y clase contrato proporciona un AtomicStampedRefernce marcada, que puede ser asegurada por la versión CAS de la corrección del valor de la variable;

clase 5. átomos

  clase java atómica se puede dividir en cuatro categorías:

      actualización atómica tipos básicos;

      Atómica tipo de actualización matriz;

      tipo de referencia actualización atómica;

      tipo de atributo de actualización atómica;

  Estos átomos se utilizan el concepto de clase de bloqueo en algunos lugares CAS directamente operación thread-safe tipo;

público  de clase AtomicIntegerTest implementos Ejecutable { 

    privada  estática Entero count = 1 ;
    privada  estática AtomicInteger atomicInteger = nueva AtomicInteger (); 

    @ Override 
    pública  vacío run () {
         tiempo ( verdadera ) {
             int count = getCountAtomic (); 
            System.out.println (recuento); 
            Si (recuento de> = 150 ) {
                 descanso ; 
            } 
        } 
    } 

    Pública  sincronizadoEntero getCount () {
         try { 
            Thread.sleep ( 50 ); 
        } Catch (InterruptedException e) { 
            e.printStackTrace (); 
        } 
        Devolver recuento ++ ; 
    } 

    Pública Entero getCountAtomic () {
         try { 
            Thread.sleep ( 50 ); 
        } Catch (InterruptedException e) { 
            e.printStackTrace (); 
        } 
        Devolver atomicInteger.incrementAndGet (); 
    } 

    Pública  estática  vacío main (String [] args) {
        AtomicIntegerTest prueba = nuevo AtomicIntegerTest (); 
        Tema Thread1 = nuevo Thread (prueba); 
        Tema thread2 = nuevo Thread (prueba); 
        thread1.start (); 
        thread2.start (); 
    } 
}

Supongo que te gusta

Origin www.linuxidc.com/Linux/2020-03/162765.htm
Recomendado
Clasificación