java基础理论学习笔记(2)——CAS底层原理?对UNSafe的理解?有什么缺点?ABA问题?

CAS是指Compare And Swap比较并交换,是一种很重要的同步思想。如果主内存的值跟期望值一样,那么就进行修改,否则一直重试,直到一致为止。CAS涉及内容如以下结构:

CAS底层:他的核心类是UNSAFE类,这个类是rt.jar中的com.misc.unsafe,里面通过native实现对底层系统的访问,所以是通过内存偏移量对操作系统直接读取值,获得主内存当前的值,用以比较。而且他拿到值,比较,如果一致就交换,这个过程是原子性的,因为他是操作系统的原指令。不会中间被其他线程插入。

CAS缺点:

CAS实际上是一种自旋锁,

  1. 一直循环,开销比较大。
  2. 只能保证一个变量的原子操作,多个变量依然要加锁。
  3. 引出了ABA问题

第一个缺点:其中unsafe的源码中有个do-while,他不限制线程并发,不加锁,会对线程里面循环一直取值进行比较,直到一致,修改完成为止,会造成循环时间长,开销大。

ABA问题:

所谓ABA问题,就是比较并交换的循环,存在一个时间差,而这个时间差可能带来意想不到的问题。比如线程T1将值从A改为B,然后又从B改为A。线程T2看到的就是A,但是却不知道这个A发生了更改。尽管线程T2 CAS操作成功,但不代表就没有问题。 有的需求,比如CAS,只注重头和尾,只要首尾一致就接受。但是有的需求,还看重过程,中间不能发生任何修改,这就引出了AtomicReference原子引用。引用类是用来解决自定义的对象类型的原子问题。解决ABA是用AtomicStampedReference,利用加戳的方式stamp:这个类维护了一个“版本号”Stamp,在进行CAS操作的时候,不仅要比较当前值,还要比较版本号。只有两者都相等,才执行更新操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章