介绍

Compare And Swap,比较并交换,是无锁的实现方式之一。在比较前通过比较共享资源的当前值与旧值,来判断是否有线程已经对共享资源进行了修改,如果没有线程进行修改,就进行更新值,如果有线程进行了修改,则放弃

实现

使用CAS实现下原子类的自增功能

  1. package cn.zjm404.stu.thread.lock.cas;
  2. public class CASDemo {
  3. /**
  4. * 共享资源
  5. */
  6. private volatile int count;
  7. public CASDemo(int _count){
  8. this.count = _count;
  9. }
  10. private synchronized int cas(int expect,int newValue){
  11. int curValue = count;
  12. //未有线程修改共享资源,进行更新
  13. if(curValue == expect){
  14. count = newValue;
  15. }
  16. //返回修改前的当前值,用于判断是否进行了更新
  17. return curValue;
  18. }
  19. public int increaseAndGet(){
  20. int newValue;
  21. //未修改成功则进行自旋
  22. do{
  23. newValue = count+1;
  24. }while(count != cas(count,newValue));
  25. return count;
  26. }
  27. }

ABA问题

就如名字,共享资源原值为 A,在进行修改前,被其他线程修改为了 B ,然后又修改为了 A,当进行检查时,当前值与旧值相同,但是共享资源其实已经进行了修改。解决方式是使用一个变量记录修改次数,每进行一次修改就 +1,进行修改时判断当前修改次数是否与进入修改时的次数一样,如果不一样,则说明有其他线程对共享资源进行了修改