java并发编程-理解CAS算法

硅谷探秘者 499 0 0

java并发编程-理解CAS算法

1.什么是cas算法?

        CAS:Compare and Swap,即比较再交换。
        jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronized同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。

2.CAS算法理解

        CAS机制当中使用了3个基本操作数:主内存值V,旧的预期值A,要修改的新值B。
如下图

当两个线程并发修改主内存的值的时候每个线程都会经过如下过程。

  1. 如果变量的预期值A和主内存值的V相同时将主内存V的值修改为B。
  2. 否则做自旋操作,重新读取主内存的值,然后重新执行过程1。

注意,java中的这个cas的操作是一个原子操作,它是利用 JNI 来完成CPU 指令的操作,是c/c++实现的。

               AtomicInteger原子类的addAndGet方法为例

public final int addAndGet(int delta) {
        return unsafe.getAndAddInt(this, valueOffset, delta) + delta;
}

             Unsafe类中addAndGet方法实现

public final int getAndAddInt(Object o, long offset, int delta) {
    int v;
    //do while 自旋操作
    do {
        //获取AtomicInteger对象在内存中偏移量为offset处的值
        v = getIntVolatile(o, offset);
    } while (!compareAndSwapInt(o, offset, v, v + delta));
    return v;
}

        CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题:ABA问题、循环时间长开销大、只能保证一个共享变量的原子操作。        

2.CAS算法在java中的应用。  

                 在java的java.util.concurrent包中提供了一组原子变量类。其中很多类使用了CAS操作。这些CAS操作基于Unsafe类中的native方法实现。    

猜你喜欢
java虚拟机(jvm) 451 硬件的效率与一致性在正式讲Java虚拟机相关的知识之前,我们先花费一点时间去了一下物机中的问题,物机遇到的问题与虚拟机中的情况有不少相似之处,物机对的处方案对于虚拟机
java基础 1422 java之service层处事务加锁可能会无效最近注意到一个问题--在service层处要多次操作数据库事务时往往要@Transactional事务注,这个时候就要注意了,如果是在
java基础 505 1.先看一下线的生命周期转换图(学java的此图必背)本篇文章的主要目的不是分析线的各种状态之间的转换,而主要是研究一下线之间的通讯机制,以及Object的wait方和notify方。所以
weblog 2982 是时间复杂度确能降低到o(n2)。百科迪杰斯特拉(Dijkstra)是由荷兰计机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉。是从一个顶点到其余各顶点的最短路径决的是有权图中
java虚拟机(jvm) 2075 概念:释运行:一边对序进行翻译,翻译成计机可以执行的指令,一边交给计机执行,翻译一句执行一句。译运行:对整个序先翻译成计机可以的指令,然后计机可以直接执行。java释执行还是
java基础 2187 已经过时了。(当方或是类上面有@Deprecated注时,说明该方或是类都已经过期不能再用,但不影响以前项目使用,提醒你新替代待的方或是类。如果序员不小心使用了它的元素,那么译器会出警告
数据结构与算法 4430 十种排序(前五)1.冒泡排序冒泡排序是一种简单的排序。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。描述:比较相邻的元素。如果第一个比第二个大,就
java springboot 613 涉及知识点:java动态译,java反射,io流,java文件操作,输入输出重定向,多线与线安全,mysql数据库设计等,起来难度较高。下面是我自己设计的几个问题,和一些测试数据。排序问题
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo
目录