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培训机构。

原文地址:https://www.cnblogs.com/gojava/p/3432930.html