jdk源码阅读-ConcurrentLinkedQueue(一)

时间:2019-09-29
本文章向大家介绍jdk源码阅读-ConcurrentLinkedQueue(一),主要包括jdk源码阅读-ConcurrentLinkedQueue(一)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

说明

concurrentLinkedQueue为无界非阻塞队列,是线程安全的 内部结构为链表的形式, 内部使用cas保存线程安全。采用cas保证原子性

什么是CAS

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作

AtomicInteger例子

 AtomicInteger atomicInteger=new AtomicInteger();
//内部通过CAS保证原子性
 atomicInteger.getAndIncrement();
  private static final Unsafe unsafe = Unsafe.getUnsafe();
  public final int getAndIncrement() {
     return unsafe.getAndAddInt(this, valueOffset, 1);
  }
   public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
            /**
             * var1为对象  var2 为对象内存中的属性值  var5 为期望值  var4为修改后的值 如果cas失败则继续重试
             * 从内存中取出var1对象的var2的值为内存值
             */
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

注意:Unsafe是c++实现的 遗憾的是这个类是jdk专用 我们并不能使用

原文地址:https://www.cnblogs.com/LQBlog/p/11607351.html