CAS的理解

x33g5p2x  于2021-11-21 转载在 其他  
字(0.8k)|赞(0)|评价(0)|浏览(260)

1、CAS是什么

  • CAS(Compare And Swap),即:对值先进行比较,符合我们的预期之后再进行赋值操作。
  • CAS是一种基于乐观锁的操作。
  • CAS操作主要来说包含三个概念:内存位置、预期原值和待赋值的新值。如果内存地址里面的值与预期原值相同,则将该值修改为新值,否则就不会对其进行修改。所以,使用CAS的时候,是要配合无限循环来进行:“获取原值——>对比原值——>尝试赋值”的操作的。如果第一次循环发现原值不匹配,无法对其赋予新值,那么修改预期原值,再次执行循环,尝试第二次赋值。

2、Java中乐观锁和悲观锁是什么

  • 乐观锁
    乐观的认为发生锁冲突的概率很低,所以采取了一种宽泛的态度,通过某种处理方式而不是采用加锁来控制资源共享。在高并发下,优点是性能会比悲观锁高很多,但是实现起来会比悲观锁更复杂。
  • 悲观锁
    悲观的认为发生锁冲突的概率很高。所以每当操作共享资源的时候,它都会将资源的使用权锁住,而当操作完毕之后,才释放这个资源的使用权,等待下一条线程对资源进行操作访问。

3、CAS存在的问题

  • 一个线程A将数组1修改为了2,接着又将2修改为了1,那么当线程B要执行CAS操作的时候,它只会看到值依然是1,而并不知道中间有过1——>2——>1的操作过程。那么针对这个问题,可以采取版本号来进行历史操作的识别,每操作一次,那么版本号都会进行+1操作。在Java5中,已经提供了AtomicStampedReference来解决问题。
  • 不能保证代码块的原子性。
    CAS机制所保证的只是变量的原子性操作,而不能保证整个代码块的原子性,所以,这时候就需要使用synchronize了。
  • CAS造成CPU利用率增加。
    如果在开发中,我们要通过CAS去修改某个变量,并且只要修改不成功,就要一直循环尝试修改,如果某条线程一直没有获取到变量所期待的值,那么会处于循环中,cpu资源会被一直占用。

相关文章