java并发编程-理解CAS算法

2019 精帖
0 194

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方法实现。    

留言(1)
加载更多
猜你喜欢
  • file Java动态译-动态运行-代码检测-练习(附sql)

    <p><span style="font-size: 14pt; color: #34495e;">涉及知识点</span>:<span style="font-size: 14pt;"><span
  • blog 广度优先搜索(bfs、广搜)java实现-数据结构和

    广度优先搜索(dfs、深搜)java实现-数据结构和 用邻接矩阵表示图的定点之间的关系 如下图的数据结构: 则用邻接矩阵表示为: private static int map[][]={ {0 ,3 ,6
  • file java 动态译测试

    <p><img src="http://www.jiajiajia.club:8089/weblog/2019_11_26/7a46618a-a787-4a1f-a80c-22119e4ae248.p
  • blog KMP

    1.PMT KMP的核心,是一个被称为部分匹配表(Partial Match Table)的数组。我觉得KMP的最大障碍就是很多人在看了很多关于KMP的文章之后,仍然搞不懂PMT中的值代表了什么意思。先来释一下这个数
  • blog -数的分

    题目描述思路:枚举,只需要枚举前两个数,满足条件的第三个数自然是2019减去前两个数。代码package lanqiao;public class TestMain1 { public static void main(String[] a
  • blog java线

    为什么用线池:1.创建/销毁线伴随着系统开销,过于频繁的创建/销毁线,会很大度上影响处效率2.线数量过多,抢占系统资源从而导致阻塞3.对线进行一些简单的管ThreadPoolExecutor线池ThreadPoolEx
  • blog 排序(递归)- 数据结构与

    思想 该使用递归实现,思路为:每次递归将待排序数组在中间位置分成左右两组,分别对左右两个数组进行归排序,递归的条件是数组长度必须大于等于3,所以当数组中只有两个数据的时候可以直接进行比较排序,若数组只有一个元素则无需操作。每次
  • blog java线通讯之生产者消费者模式

    java线通讯之生产者消费者模式         生产者消费者模式是、多线中经典的设计模式,生产者和消费者通过分离的执行工作耦,简化了开模式,生产者和消费者可以以不同的速度生产和消费
  • blog java使用欧几里得比例的方

    java使用欧几里得比例的方 public static void main(String[] args) { System.out.println(bili(2,6)); } public static Strin
  • blog java实现decode码的json字符串参数服务端创建对象

    例: java类如下: public class QuestionnaireSubject { private Integer id; private String name; public Integer getId() {