java中的cas是什么意思,java cas使用

  java中的cas是什么意思,java cas使用

  这篇文章给大家带来了一些关于java的问题,主要是关于CAS,CAS(compare and swap),compare and swap,这是一种解决多线程并行情况下使用锁导致性能损失的机制。希望对你有帮助。

  如何解决写爬虫IP受阻的问题?立即使用。

  

CAS解释:

   CAS(比较和交换),比较和交换。一种可以解决多线程并行情况下使用锁造成的性能损失的机制。CAS操作包含三个操作数——内存位置(V)、预期原始值(A)和新值(B)。如果存储位置的值与预期的原始值匹配,处理器将自动将位置值更新为新值。否则,处理器什么也不做。一个线程从主内存中获取num值并对其进行操作。写入值时,线程会将第一次获得的num值与主存中的num值进行比较。如果相等,它将把改变后的num写入主存储器。如果不相等,它将继续循环比较,直到成功。

  

CAS产生:

  修改共享变量时经常使用volatile关键字,但是volatile值具有可见性,禁止命令重取(排序),所以无法保证原子性。虽然单线程没有问题,但是多线程会出现各种问题,造成不安全的场景。所以在jdk1.5之后,CAS应运而生,使用CPU原语(不可分割、连续不间断)来保证现场操作的原子性。

  

CAS应用:

   JDK 1.5中java.util.concurrent(JUC)的添加基于CAS。与synchronized的锁定机制相比,CAS是一种常见的非阻塞算法实现。因此,JUC的性能有了很大的提高。

  比如AtomicInteger类,AtomicInteger是线程安全的,下面是源代码。

  进入unsafe,可以看到do while的自循环。这里的自循环是判断如果期望的原值和原值不一致,你就回收原值,然后走CAS流程,直到可以成功赋值新值。

  

CAS优点

   cas是乐观锁的一种思想,是一种非阻塞的轻量级乐观锁。非阻塞是指一个线程的失败或挂起不应该影响其他线程的失败或挂起的算法。

  

CAS 缺点

  周期时间长,成本高,占用CPU资源。如果自旋锁长时间失效,会给CPU带来很大的开销。如果JVM能够支持处理器提供的暂停指令,效率会有一定程度的提高。暂停指令有两个功能。第一,可以延迟去流水线,让CPU不会消耗太多的执行资源。延迟时间取决于具体的实现版本。在某些处理器上,延迟时间为零。其次,可以避免退出循环时内存顺序违规导致的CPU流水线刷新,从而提高CPU的执行效率。只能保证共享变量的一个原子操作。在对一个共享变量进行操作时,我们可以使用循环CAS来保证原子操作,但是在对多个共享变量进行操作时,循环CAS无法保证操作的原子性。这时候可以使用锁,或者有一个比较棘手的办法,把多个共享变量合并成一个共享变量来操作。比如有两个共享变量I=2,J=A,合并ij=2a,然后用CAS来运算ij。从Java1.5开始,JDK提供了AtomicReference类来保证引用对象之间的原子性。您可以在一个对象中放置多个变量来执行CAS操作。ABA问题解决ABA问题(如果值考虑结束,不考虑过程问题可以忽略)

  添加版本号AtomicStampedReference从Java1.5开始,JDK的原子包提供了一个类AtomicStampedReference来解决ABA问题。此类的compareAndSet方法用于首先检查当前引用是否等于预期引用,以及当前标志是否等于预期标志。如果都相等,则以原子方式将引用和标志的值设置为给定的更新值。

  

CAS使用的时机

  线程数量少,等待时间短。自旋锁可用于尝试在CAS中获取锁,这比同步更有效。由于线程数量多,等待时间长,不建议使用自旋锁,自旋锁占用CPU高。建议学习:《java学习教程》以上是java的CAS讲解的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: