CAS机制
CAS——CompareAndSwap:比较并替换
作用是进行计算的时候判断当前值是否满足预期,如果满足则更新为新值,保证整个过程具备原子性。通过内存中的值,逻辑值和要更改的值进行比较替换,通过自旋的方式在操作内存的值的时候通过内存的值和逻辑值进行比较,如果一致,则替换更改(这一步原子操作)。
代码分析:
JDK中为了方便开发正操作,已经实现了很多原子性操作的类,这些类底层就是通过CAS控制原子操作的,比如AtomicInteger,通过AtomicInteger 提供的API就可以验证CAS的简单执行原理。在AtomicInteger API中可以看到具体实现是通过sun.misc包中的Unsafe类实现的。后面会简单的说明,如下代用来验证CAS的简单执行过程和思想。
public class Test {
public static void main(String[] args) {
AtomicInteger test = new AtomicInteger();
System.out.println(test.get()); // 初始化的 值为 0
/*
//该方法就是根据预期来更新值得,底层是调用了Unsafe类的 compareAndSwapInt
//expect 预期值, update 更新的值
public final boolean compareAndSet(int expect, int update) {
// 最后调用的是Unsafe类中的compareAndSwap 方法
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
*/
boolean b = test.compareAndSet(2, 1); // 传入一个预期值2 但实际值是0
System.out.println(b); // false 实际值0 不满足预期值2 即设置不成功
System.out.println(test.get()); // 0
b = test.compareAndSet(0, 10); // 预期值0 实际值0
System.out.println(b); // true
System.out.println(test.get()); // 10 满足预期
}
}
Unsafe 类
Unsafe是存在于sun.misc包中的一个类,该类的作用是使Java拥有想C语言一样直接操作内存空间的能力,该类使用了单利模式,需要通过一个静态方法来获取,但是又做了限制,如果是普通调用,会抛出一个SecurityException的异常,只允许jdk 加载核心类的类加载器(Bootstrap)加载的类才可以调用。该类提供了很多直接操作内存的方法。
// Unsafe提供了许多可以直接操作内存的一些API
// 如分配指定内存大小,释放内存,给指定内存设值等。
public native long allocateMemory