java中的Unsafe和CAS

Unsafe

Java只能通过本地方法访问本地操作系统

不过,还有一个后门,那就是JDK提供Unsafe类,这个类可以提供硬件级别的原子操作

Unsafe类的使用是受限制的,只有授信的代码才可以获得该类的实例

CAS

Compare and Swap(比较与交换)

JUC包的实现基础就是CAS,CAS是通过Unsafe类实现的,Unsafe是CAS的核心类

CAS有三个操作数:内存值V,旧的预期值A,要修改的值B

当且仅当A==V时,将内存值修改为B并返回true

否则什么都不做并返回false

传统的compareandswap方法加锁同步来实现原子操作,CAS同样,比较和交换也是一组原子操作,先获取到当前内存中的内存值V,再将V与A比较,要是相等就修改为B。由于CAS都是硬件级别的操作,所以效率高。

CAS的缺点

CAS存在一个逻辑漏洞,如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到没变,那我们就能说明它的值没被其它的线程修改过吗????

如果在这段时间内它的值曾经被修改为B,然后又改回了A,那CAS操作就会误认为他从来都没有被修改过,这个漏洞称为CAS的“ABA”问题

JUC为了解决这个问题,提供了一个带有标记的原子引用类“AtomicStampedReference”,他可以通过控制变量值的版本来保证CAS的正确性