锁|CAS - 自旋锁 - 无锁
JAVA 在
java.util.concurrent.atomic.*
包下的类都是通过 CAS 方式实现操作的原子性的。AtomXXX 类本身方法都是原子性的,但不能保证多个方法连续调用是原子性的.
CAS - COMPARE AND SWAP
CAS 是 compare and swap 的缩写,核心方法是 cas(V,E,N) ;V 是需要更新的变量,E 当前这个变量的预期值(旧值),N 新的值。
如果 V 值等于 E 值,则将 V 值设为 N 值;如果 V 值不等于 E 值,说明其他线程做了更新,那么当前线程什么也不做。(放弃操作或重新读取数据)
乐观锁
CAS 是属于乐观锁,多个线程竞争,只有一个胜出,其余线程继续抢占,不会挂起。
UnSafe 类
在 JAVA 中的 CAS 操作是依赖与 UnSafe 类完成的,主要依赖 UnSafe 类中的 3 个方法,如下:
//第一个参数o为给定对象,offset为对象内存的偏移量,通过这个偏移量迅速定位字段并设置或获取该字段的值,
//expected表示期望值,x表示要设置的值,下面3个方法都通过CAS原子指令执行操作。
public final native boolean compareAndSwapObject(Object o, long offset,Object expected, Object x);
public final native boolean compareAndSwapInt(Object o, long offset,int expected,int x);
public final native boolean compareAndSwapLong(Object o, long offset,long expected,long x);
CLH