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指令的类.一般认为,有锁的方式就是阻塞的方式,阻塞 -> 线程挂起,是进入临界区之前系统来给它挂起.
    无锁类的学习可以参考别的资源.
    转载请注明来源,谢谢
  • 相关阅读:
    (转)浮点数的存储方式
    (转)静态变量和全局变量的区别
    (转)RTMP协议从入门到放弃
    python: format
    Tornado web.authenticated 用户认证浅析
    Python时间,日期,时间戳之间转换
    Python图片处理PIL/pillow/生成验证码/出现KeyError: 和The _imagingft C module is not installed
    Python图像处理库:Pillow 初级教程
    Python练习册--PIL处理图片之加水印
    python中string模块各属性以及函数的用法
  • 原文地址:https://www.cnblogs.com/zhhiyp/p/9458815.html
Copyright © 2011-2022 走看看