CAS es una instrucción de CPU, ¡consíguela! ¿No entiendes? ¡Entonces entra y echa un vistazo!

Hola a todos, lo soy, 方圆
debemos aprender muchos hilos


1. Dime, ¿qué es CAS?

Inserte la descripción de la imagen aquí
No, quieres escucharlo.

CAS nombre chino “比较并交换”, no CPU指令se puede interrumpir, pero también nuestra 乐观锁realización común del principio, CAS en tres operandos, respectivamente 内存值, 预期值y debería 修改的值, si y solo si el mismo valor de memoria y el valor esperado, será Modifíquelo, de lo contrario no lo modifique.

1.1 Ahora escribamos una demostración del principio CAS por nosotros mismos

Inserte la descripción de la imagen aquí
Si lo entiende, le encantará aprender, entonces mire

public class Demo {
    
    
	//内存值
    private volatile int value;
    //期望值和修改后的值都有了,这个方法用synchronized修饰
    public synchronized void compareAndSwap(int expectedValue, int newValue){
    
    
        if(expectedValue == value)
            value = newValue;
    }
}

2. Analizar el código fuente de AtomicInteger

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

2.1 Centrémonos en el método getAndIncrement

El funcionamiento es 当前对象, value的地址值,增加值为1

    public final int getAndIncrement() {
    
    
        return unsafe.getAndAddInt(this, valueOffset, 1);
    }

Entre ellos, el método getAndAddInt usa el giro de CAS.
Inserte la descripción de la imagen aquí
El método getiIntVolatile es un método c ++ modificado por native
Inserte la descripción de la imagen aquí

  • En resumen,
    AtomicInteger carga la herramienta Inseguro, que se utiliza para manipular 内存datos directamente .
    Utilice volatile para modificar campos para garantizar la visibilidad

3. Hable brevemente sobre la clase Inseguro.

  • Inseguro es la clase principal de CAS, Java no puede acceder directamente al sistema operativo subyacente, pero acceder a través de nativemétodos modificados
  • valueOffset representa la dirección de offset de la variable value en la memoria, porque Unsafe obtiene el valor original de los datos de acuerdo con la dirección de offset de memoria, por lo que podemos implementar CAS a través de Unsafe

Empezando

Supongo que te gusta

Origin blog.csdn.net/qq_46225886/article/details/107883418
Recomendado
Clasificación