• Java的CAS与ABA问题


    CAS操作是计算机底层的操作,对于内存中的某一个值V,提供一个旧值A和一个新值B,如果提供的旧值V和A相等就把B写入V,CAS操作是基于底层命令的,是原子性的操作

    CAS在可以作为乐观锁的使用,每次操作不加锁,假设没有冲突,如果因为冲突失败就重试,直到成功为止

    Java对CAS提供了很好的支持,如AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference等

    CAS中存在一个经典的问题,即ABA问题:如果另一个线程修改V值假设原来是A,先修改成B,再修改回成A。当前线程的CAS操作无法分辨当前V值是否发生过变化

    而对于ABA问题,Java也提供了很好的解决方案,AtomicStampedReference

    AtomicStampedReference在内部维护了一个Pair类,除了存储Reference外,也存储了当前数据对应的版本号,在执行compareAndSet方法时,会判断版本号是否一致,如果版本号不一致,则说明Reference已经发生过变化,在执行CAS操作时,实际更新的是Pair对象,因此Reference和版本号是同时原子更新的

    Java同时提供了一个AtomicMarkableReference类,AtomicMarkableReference与AtomicStampedReference的API类似,但是AtomicMarkableReference并没有维护版本号,只是维护了一个boolean类型的mark值,因此,如果说AtomicStampedReference是用于防止多次操作,使用stamp作为每次更新的版本号,那么AtomicMarkableReference则是使用mark作为标记值,用于标志一个引用的状态

    这里附一段官方文档:

    The AtomicMarkableReference class associates a single boolean with a reference.
    For example, this bit might be used inside a data structure to mean that the object being referenced has logically been deleted.
    The AtomicStampedReference class associates an integer value with a reference.
    This may be used for example, to represent version numbers corresponding to series of updates
  • 相关阅读:
    Window PHP 使用命令行模式
    LNMP ftp 可以登录无权限操作?
    linux 允许mysql用户远程访问
    解决报错:scandir() has been disabled for security reasons
    LNMP 配置二级域名
    MUI 图片上传剪切预览,可选(拍照+系统相册)
    MUI 单个图片上传预览(拍照+系统相册):先选择->预览->上传提交
    MUI 单图片压缩上传(拍照+系统相册): 选择立即上传
    循环递归的区别?
    如何让自己的广播只让指定的 app 接收?
  • 原文地址:https://www.cnblogs.com/yytxdy/p/12357824.html
Copyright © 2020-2023  润新知