java cas面试,java中cas机制的描述,错误的是

  java cas面试,java中cas机制的描述,错误的是

  比较和交换,CPU并发原语。作用是判断内存中某个位置的值是否是期望值,如果是,就换一个新值。这个过程是原子性的。

  在JMM模型中,可以知道每个线程都会将主存中的数据复制到自己的内存中进行操作,而CAS则将当前工作内存中的值与主存中的值进行比较。如果相同,它将执行规定的操作,否则,它将继续比较,直到主存储器和工作存储器中的值一致。

  我们先来看一个演示:

  公共类CASDemo1 {

  公共静态void main(String[] args) {

  atomic integer atomic integer=new atomic integer(6);

  system . out . println(atomic integer . compare andset(6,2020) value: atomic integer . get());

  system . out . println(atomic integer . compare andset(6,1111) value: atomic integer . get());

  }

  }

  //结果如下:

  真实值:2020年

  真值:2020cas底层原理的核心是Unsafe类(jdk中rt.jar中sun.misc下的Unsafe类)。因为Java方法不能直接访问底层系统,需要通过原生方法访问。不安全相当于一个后门,基于这个后门可以直接操纵特定内存的数据。换句话说,CAS实际上是直接操作的地址中的内容。

  CAS并发原语体现在JAVA语言中,即sun.misc.Unsafe类中的每个方法。在UnSafe类中调用CAS方法,JVM会帮助我们实现CAS汇编指令。这是一个完全依赖硬件的功能,通过它实现原子操作。还是那句话,因为CAS是一个系统原语,原语属于操作系统术语的范畴,由若干条指令组成,用来完成某个功能的一个进程。而且原语的执行必须是连续的,执行过程中不允许中断,也就是说CAS是CPU的原子指令,不会造成所谓的数据不一致问题。

  总结:

  Java的cas利用了unsafe类提供的cas操作。

  不安全的cas依赖于jvm为不同操作系统实现的Atomic:cmpxchg。

  atomic: cmpxchg实现使用组装的cas操作,并使用cpu硬件提供的锁信号来确保其原子性。

  CAS 1的缺点。周期时间长,开销大(do…while);

  2.只能保证一个共享变量的原子操作;

  3.会导致ABA的问题。

  说说AtomicInteger吧。为什么要用CAS而不是synchronized?同一时间只能有一个线程访问,保证了线程安全,但并发性降低。

  可以通过CAS反复比较,不加锁,既保证了一致性,又提高了并发性。

  ABA CAS算法实现的一个重要前提是把内存中某一时刻的数据取出来,在当前时刻进行比较替换,所以这个时差类会导致数据的变化。

  线程1从内存中的位置V取出A,线程2此时也从内存中取出A,改为B,再改为A,此时线程1进行CAS运算,发现还是A,进行CAS运算。

  虽然线程1的CAS操作是成功的,但并不意味着这个过程没有问题。

  解决:

  AtomicStampedReference,在原来的基础上增加一个版本号。

  版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。

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

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