锁|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

https://www.infoq.cn/article/bvpvyvxjkm8zstspti0l