• CAS机制
        CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。 CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。 更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B
        synchornized(内置锁)从思想上来说是属于悲观锁,悲观地认为程序中的并发情况严重,所以使用数据之前先加锁即严防死守。而CAS机制属于乐观锁,乐观地认为程序中地并发情况不那么严重,所以让线程不断地去尝试更新。
 
java基础| 多线程基础三:CAS原理和原子操作
CAS中地比较和交换过程(自旋地过程)
  • CAS机制地优缺点

优点:在并发量不高地情况下可以避免线程地阻塞,从而可以提高效率。

缺点:

  1. 自旋(循环)过程开销大。
  2. 只能保证单独共享变量地原子操作。
  3. ABA问题
  • java中的原子操作类

原子操作类在实际开发应用中用的并不是太多,故引用<java并发编程的艺术>中的部分内容

atomic包提供原子更新基本类型的工具类:

  1.         AtomicBoolean: 以原子更新的方式更新boolean。
  2.         AtomicInteger: 以原子更新的方式更新Integer。
  3.         AtomicLong: 以原子更新的方式更新Long。

    以AtomicInteger为例总结常用的方法:

  • addAndGet(int delta) :以原子方式将输入的数值与实例中原本的值相加,并返回最后的结果;
  • incrementAndGet() :以原子的方式将实例中的原值进行加1操作,并返回最终相加后的结果;
  • getAndSet(int newValue):将实例中的值更新为新值,并返回旧值;
  • getAndIncrement():以原子的方式将实例中的原值加1,返回的是自增前的旧值;

atomic包下提供能原子更新数组中元素的类有:

  1. AtomicIntegerArray:原子更新整型数组中的元素;
  2. AtomicLongArray:原子更新长整型数组中的元素;
  3. AtomicReferenceArray:原子更新引用类型数组中的元素

    以AtomicIntegerArray来总结下常用的方法:

  1. addAndGet(int i, int delta):以原子更新的方式将数组中索引为i的元素与输入值相加;
  2. getAndIncrement(int i):以原子更新的方式将数组中索引为i的元素自增加1;
  3. compareAndSet(int i, int expect, int update):将数组中索引为i的位置的元素进行更新

如果需要原子更新引用类型变量的话,为了保证线程安全,atomic也提供了相关的类:

  1. AtomicReference:原子更新引用类型;
  2. AtomicReferenceFieldUpdater:原子更新引用类型里的字段;
  3. AtomicMarkableReference:原子更新带有标记位的引用类型;

如果需要更新对象的某个字段,并在多线程的情况下,能够保证线程安全,atomic同样也提供了相应的原子操作类:

  1. AtomicIntegeFieldUpdater:原子更新整型字段类;
  2. AtomicLongFieldUpdater:原子更新长整型字段类;
  3. AtomicStampedReference:原子更新引用类型,这种更新方式会带有版本号。而为什么在更新的时候会带有版本号,是为了解决CAS的ABA问题;

     要想使用原子更新字段需要两步操作:

  1. 原子更新字段类都是抽象类,只能通过静态方法newUpdater来创建一个更新器,并且需要设置想要更新的类和属性;
  2. 更新类的属性必须使用public volatile进行修饰;

相关文章: