zoukankan      html  css  js  c++  java
  • java并发 无锁cas的最简单理解

    无锁就是无障碍,多个线程竞争一定会有一个胜出
    无锁在jdk是基于cas算法去实现的
    cas:compare and swap
    CAS算法:
    一开始我也不理解CAS算法,再次学习终于理解了.现在给一个场景:
    假设我有好几个线程,要去操作一个数据,比如库存值,我肯定得先读,读了后,我知道是10.
    我也知道好几个线程同时去操作,改写肯定有并发问题,我想达到的效果是就一个线程成功操作,其他给我失败掉.
    那此时我们知道预期值就是10,我的线程去竞争的时候就必须先读到数据,看看是不是10,如果是10,那这个线程就可以修改这个数据.
    按先来后到,后面的线程晚了一步的时候,肯定会发现数据不是10了,那就无法修改.这个就是cas操作.
    在cas里面,预期值是多少我觉得是最重要的,实现方式也有很多,比如多个线程去读,那在这些线程操作之前先有一个线程读,比如说主线程.
    这样就实现了一个无锁,也就是不需要在多线程进来竞争的时候再加锁了.当然也会有别的资源损耗,这都是可以接受的.
    CAS学习的疑惑:
    很显然,读了上面的一段话,就会觉得一开始还要先读,读的时候还要求其他线程都先别动,似乎操作很麻烦.从算法层面来讲,
    先读 -> 再多个线程来竞争,是有点麻烦的.但是CAS的应用中,在jvm里它是一个底层原子性的操作(CPU操作),你可以理解为先读的时候自然做到其他线程不会也进来读.CAS的操作的原子一样不可分割的.
    JAVA中的无锁类:
    所谓无锁类,就是在底层使用这种cas指令的类.一般认为,有锁的方式就是阻塞的方式,阻塞 -> 线程挂起,是进入临界区之前系统来给它挂起.
    无锁类的学习可以参考别的资源.
    转载请注明来源,谢谢
  • 相关阅读:
    深度优先搜索
    哈希算法
    双指针问题
    基本概念
    Ionic JPush极光推送二
    一条sql获取每个类别最新的一条记录
    Ionic App 更新插件cordova-plugin-app-version
    Ionic跳转到外网地址
    Ionic cordova-plugin-splashscreen
    Web API 上传下载文件
  • 原文地址:https://www.cnblogs.com/zhhiyp/p/9458815.html
Copyright © 2011-2022 走看看