从Java的对象头与CAS操作到Java内建锁synchronized的底层实现(二)

   在这一篇中我会介绍一下CAS操作。

什么是CAS:取得锁时每一次都会有竞争是一种最不好的情况,但事实往往并不需要我们每一次都竞争,其实不会每一次执行临界代码都会发生冲突,CAS是一种乐观锁的策略。他假设所有线程共享资源的时候都不会出现冲突,自然也就不会阻塞其他线程了。借助CAS比较交换来鉴别线程是否出相冲突,出现冲突就重试到没有冲突为止。

    CAS 通俗理解是(V,O,N)代表三个值:V内存地址存放的实际值;O预期的值(旧值);N更新的新值。当V==O时 ,说明内存地址存放的值没有被其他线程更改,就可以将新值N 付给V。但当O!=V时,说明该值被其他的线程修改过,改旧值O不是最新版本的值,不可以将新值N赋给V,返回V就可以。当多个线程使用CAS操作一个变量时,只有一个会成功,并成功更新,其余都会失败。

    CAS是一种乐观锁的策略,他解决了悲观锁时频繁阻塞线程对系统的并发性带来的压力,但也引入了新的问题。

1,ABA问题,比如线程2在与线程1竞争时拿到了锁并把V(内存地址存放的值)从A修改为新值B,又有线程3在于线程2竞争时拿到了锁把V中的值从B又改回了A,这时线程1在做CAS是发现值没有变换,但实际上是变化了,这时如果线程1 把V换成他的新值,那么影响的就是线程1,线程2,线程3三个线程了。

解决方法,加上版本号。

2.自旋(竞争失败的锁不断重试,直到锁被释放)会浪费大量的处理器资源。

3.公平性

自旋状态的线程更容易获得锁一些,而被阻塞的线程不可以立即的参与竞争。

下面是我画的一个过程图,欢迎大家阅览,注意从上向下代表着时间的增加。

猜你喜欢

转载自blog.csdn.net/a15929748502/article/details/84395578