Hola a todos, lo soy,
方圆
debemos aprender muchos hilos
Tabla de contenido
1. Dime, ¿qué es CAS?
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
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
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.
El método getiIntVolatile es un método c ++ modificado por native
- 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
native
mé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