美文网首页
CAS-AtomicIntger 为例

CAS-AtomicIntger 为例

作者: Wi1ls努力努力再努力 | 来源:发表于2019-04-29 18:09 被阅读0次

众所周知,i++或者++i 是线程不安全的,因为其涉及到读取,自增,赋值等多步操作而非原子操作。
Java 提供了 AtomicInteger ,利用 CAS 进行原子性的自增。

@AtomicInteger
private volatile int value;

public final int incrementAndGet( ){
  for(;;){
    int current = get( );
    int next = current + 1;
    if(compareAndSet(current, next){
        return next;
    }
  }
}

public final int get( ){
  return value;
}

AtomicInteger 自增的原子性是通过 CAS的死循环进行的,即一种乐观锁。


多线程进行++i 的时候,会导致覆盖导致自增失败。
value 是 volatile,因为是线程可见的。而 其自增的可靠性在于强调的是自增的次数。如果本次自增失败,那么下次循环继续尝试直到成功为止。

Unsafe.compareAndSwapInt( )最后是在汇编层面加了锁,直接操作了内存

@atomic_linux_x86.inline.hpp
#define LOCK_IF_MP(mp) "cmp $0, " #mp "; je 1f; lock; 1: "

inline jint     Atomic::cmpxchg    (jint     exchange_value, volatile jint*     dest, jint     compare_value) {
  int mp = os::is_MP();
  __asm__ volatile (LOCK_IF_MP(%4) "cmpxchgl %1,(%3)"
                    : "=a" (exchange_value)
                    : "r" (exchange_value), "a" (compare_value), "r" (dest), "r" (mp)
                    : "cc", "memory");
  return exchange_value;
}

相关文章

  • CAS-AtomicIntger 为例

    众所周知,i++或者++i 是线程不安全的,因为其涉及到读取,自增,赋值等多步操作而非原子操作。Java 提供了 ...

  • iOS 方法参数‘按位或’的原理

    先以UIViewAutoresizing为例: 再以AVAudioSessionCategoryOptions为例...

  • DFS与BFS

    以先序遍历打印链表为例: 以中序遍历打印链表为例: 以后序遍历打印链表为例: 以层序遍历打印链表为例:

  • Java数组排序原理

    Arrays排序原理 计数排序源码 (short为例) 插入排序源码 (int为例) 快排源码 (int为例) 归...

  • 得到为例

    以一款内容产品为例,列举其内容质量标准、质量控制方式、呈现手段的种类,以及推送和推荐策略 内容产品,得到,出品团队...

  • 以简书为例,看简书编辑器

    以简书为例,看简书编辑器 以简书为例,看简书编辑器 以简书为例,看简书编辑器 以简书为例,看简书编辑器 以简书为例...

  • thinkphp3.2.3隐藏index.php入口文件

    说明:Mac(以 MAMP 为例) / Window (以 phpstudy 为例) 一、Mac(以 MAMP 为...

  • pcolormesh函数

    pcolormesh()的作用就是绘制背景图 例一:以鸢尾花为例 绘制结果: 例二:以KNN模型为例 绘制结果 转...

  • 二、对象包装器与自动装箱 常用方法

    Integer 为例

  • 正整数校验

    *************** 以A 为例 ************************...

网友评论

      本文标题:CAS-AtomicIntger 为例

      本文链接:https://www.haomeiwen.com/subject/xarunqtx.html