并发编程中的CAS

定义

博客链接1
多线程并发环境下,有两种更新共享变量的方式: 1)悲观锁 2)乐观锁

  • 悲观锁
    线程访问同步代码块之前加锁,访问完成再释放。其他线程如果也访问,从runable状态变为blocked状态,等待线程结束再进入就绪状态等待操作系统调度。
  • 乐观锁
    线程访问共享变量时,从主内存中拷贝数据到工作内存,更新操作修改将计算后的值再更新到主内存中。CAS(compare and set):在更新操作前,比较工作内存中未处理之前的值 与 主内存目前的值 是否相同,如果相同直接更新,如果不相同则重新加载->计算->保存。CAS机制中的这步步骤是原子性的(从指令层面提供的原子操作)

优缺点

优点

  • 可以保证变量操作的原子性
  • 在线程占用共享变量时间短时,效率高
  • 在并发量不大的情况下,比syschronized效率高

缺点

  • ABA问题:虽然值相同但被修改过,通过使用Pair类,加入版本号
  • 在线程之间竞争程度大的时候,如果使用CAS,每次都有很多的线程在竞争,也就是说CAS机制不能更新成功。这种情况下CAS机制会一直重试,这样就会比较耗费CPU。因此可以看出,如果线程之间竞争程度小,使用CAS是一个很好的选择;但是如果竞争很大,使用锁可能是个更好的选择。
  • 不能保证共享代码块的原子性
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容