chapter15_原子变量与非阻塞同步机制_4_非阻塞算法

  • 原子变量的compareAndSet操作__既能提供原子性, 又能提供可见性__

      public class AtomicInteger extends Number implements java.io.Serializable {
    
          ...
    
          private static final jdk.internal.misc.Unsafe U = jdk.internal.misc.Unsafe.getUnsafe();
    
          ...
    
          public final int incrementAndGet() {
              return U.getAndAddInt(this, VALUE, 1) + 1;
          }
    
          ...
      }
    
      public final class Unsafe {
    
          ...
    
          @HotSpotIntrinsicCandidate
          public final int getAndAddInt(Object o, long offset, int delta) {
    
              int v;
    
              do {
                  v = getIntVolatile(o, offset);
              } while (!weakCompareAndSetInt(o, offset, v, v + delta));
      
              return v;
          }
    
          ...
      }
    
  • 非阻塞计数器

      @ThreadSafe
      public class CasCounter {
    
          private SimulatedCAS value;
    
          public int getValue() {
    
              return value.get();
          }
    
          public int increment() {
    
              int v;
      
              do {
                  v = value.get();
              } while (v != value.compareAndSwap(v, v + 1));
    
              return v + 1;
          }
      }
    
  • 非阻塞的栈

      @ThreadSafe
      public class ConcurrentStack<E> {
    
          private AtomicReference<Node<E>> top = new AtomicReference<Node<E>>();
    
          public void push(E item) {
    
              Node<E> newHead = new Node<>(item);
              Node<E> oldHead;
      
              do {
                  oldHead = top.get();
                  newHead.next = oldHead;
              } while (!top.compareAndSet(oldHead, newHead));
          }
    
          public E pop() {
      
              Node<E> oldHead;
              Node<E> newHead;
      
              do {
                  oldHead = top.get();
                  if (oldHead == null) {
                      return null;
                  }
          
                  newHead = oldHead.next;
    
              } while (!top.compareAndSet(oldHead, newHead));
    
              return oldHead.item;
          }
    
          private static class Node<E> {
    
              public final E item;
              public Node<E> next;
    
              public Node(E item) {
    
                  this.item = item;
              }
          }
      }
    
  • CAS的基本使用模式是

    在更新某个值时存在不确定性, 在更新失败时重新尝试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值