欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java-CAS(Compare And Swap)

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

Java-CAS(Compare And Swap)

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值时,也会更新时间戳。