CAS

CAS 比较并交换 CompareAndSwapjava

比较当前工做内存中的值和主内存中值,若是相同则执行规定操做,不然积蓄比较直到主内存和工做内存中的值一致为止。若是CCAS失败,会一直进行尝试。若是CAS长时间一致不成功,可能会给CPU带来很大的开销。算法

CAS操做包含三个操做数:内存位置(V)、预期原值(A)、新值(B),若是内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新增。多线程

CAS的目的:利用CPU的CAS指令,同时借助JNI来完成java的非阻塞算法。操作系统

CAS存在的问题:虽然很高效的解决了原子操做,可是存在三大问题;线程

(1)     ABA问题;内存

(2)     循环时间长开销大资源

(3)     只能保证一个共享变量的原子操做变量

Unsafe是CAS的核心类,因为java方法没法直接访问底层系统,须要经过本地(native)方法来访问,Unsafe至关于一个后门,基于该类能够直接操做特定的内存的数据。循环

Unsafe类中的全部方法都是native修饰的,也就是说Unsafe类中的方法都直接调用操做系统底层资源执行相应任务。引用

变量valueOffset,表示该变量值在内存中的偏移地址,由于Unsafe就是根据内存偏移地址获取数据的。

变量value用volatile修饰,保证了多线程之间的内存可见性。

解决ABA问题  AtomicReference原子引用

相关文章
相关标签/搜索