• Java并发编程学习笔记之CAS操作


      广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,更多java知识,android知识,ios知识,疯狂软件官网持续更新中。

      CAS操作

      CAS是单词compare and set的缩写,意思是指在set之前先比较该值有没有变化,只有在没变的情况下才对其赋值。

      我们常常做这样的操作

      if(a==b) {

      a++;

      }

      试想一下如果在做a++之前a的值被改变了怎么办?a++还执行吗?出现该问题的原因是在多线程环境下,a的值处于一种不定的状态。采用锁可以解决此类问题,但CAS也可以解决,而且可以不加锁。

      int expect = a;

      if(a.compareAndSet(expect,a+1)) {

      doSomeThing1();

      } else {

      doSomeThing2();

      }

      这样如果a的值被改变了a++就不会被执行。

      按照上面的写法,a!=expect之后,a++就不会被执行,如果我们还是想执行a++操作怎么办,没关系,可以采用while循环

      while(true) {

      int expect = a;

      if (a.compareAndSet(expect, a + 1)) {

      doSomeThing1();

      return;

      } else {

      doSomeThing2();

      }

      }

      采用上面的写法,在没有锁的情况下实现了a++操作,这实际上是一种非阻塞算法。

      应用

      java.util.concurrent.atomic包中几乎大部分类都采用了CAS操作,以AtomicInteger为例,看看它几个主要方法的实现:

      public final int getAndSet(int newValue) {

      for (;;) {

      int current = get();

      if (compareAndSet(current, newValue))

      return current;

      }

      }

      getAndSet方法JDK文档中的解释是:以原子方式设置为给定值,并返回旧值。原子方式体现在何处,就体现在compareAndSet上,看看compareAndSet是如何实现的:

      public final boolean compareAndSet(int expect, int update) {

      return unsafe.compareAndSwapInt(this, valueOffset, expect, update);

      }

      不出所料,它就是采用的Unsafe类的CAS操作完成的。

      疯狂Java培训机构拥有最好的Java培训途径,这是疯狂Java老师们经过多年经验总结出来的。Java技术简单易学,虽然Java技术涉及的内容十分广泛,只要有资深教师传授技术知识,就能在短期内实现Java高级工程师的梦想。如果初学者能够参加疯狂Java培训,有好的老师,好的培训途径,好的教材,让你成为最好的编程高手。疯狂Java培训,零基础教学,名师教学让你学得快学得牢,还能灵活运用。学软件开发,首选疯狂Java培训机构。

  • 相关阅读:
    GO 语言使用copy 拷贝切片的问题
    ggplot 局部放大
    R语言hist重叠图作法
    illumina SNP 芯片转基因型矩阵
    Shell 变量嵌套
    JVM指令
    VUE—CLI学习
    Gradle 项目打开自动下载Zip问题及相关配置
    MySQL8服务无法启动,服务没有报告任何错误
    SpringMVC相关
  • 原文地址:https://www.cnblogs.com/gojava/p/3432930.html
Copyright © 2020-2023  润新知