Java-CAS(Compare And Swap)

1.并发编程中有两种派别,一种是乐观派,一种是悲观派。
  即加锁是悲观派,不加锁而使用CAS是乐观派。
2.CAS核心算法:
  执行函数:CAS(V,E,N)
  V:表示要更新的值。
  E:表示预期值。(Expect)
  N:表示新值。(New)

在这里插入图片描述

3.多线程同时使用CAS操作一个值,只有一个会胜出,其余都失败。
  免疫死锁。
4.CPU对CAS支持:
  1.多线程如果在更新V这个操作中间有其他线程更新V值怎么办?
  2.CAS是系统原语,原语用来完成某个功能,并且其执行过程是连续的,不可被中断。
  3.所以CAS是一条CPU的原子指令。不会造成数据不一致。
5.CAS的ABA问题:
  1.即线程在拿到V值后,判断V==E?前,其他两条线程已经修改了两次或以上次数,
    将V值改回了原来的值,这样第一条线程判断会通过,但不知道已经改了两次。

  2.虽然可能没问题,但还是要防止。

  3.方法:使用AtomicStampedReference类(会记下修改时间的时间戳,一起去对比)
         每次更新V值时,也会更新时间戳。

猜你喜欢

转载自blog.csdn.net/weixin_41227335/article/details/88230556