zoukankan      html  css  js  c++  java
  • 122原子性操作的一些记录

    1、i++javap后的指令码,分别为操作数栈内 堆内存取i, 存入常量1,执行加法,写回堆内存多步操作。非原子性,会有线程问题。

          处理办法,加锁(synchronize,ReentrantLock)或者atomicInteger。   或者使用cas(compare and swap)操作(-硬件同步原语)

    2、cas自旋:cas操作失败后,继续重试整个过程。cas的java执行,Unsafe(需要反射调用)。CompareAndSwapXX

         偏移量:修改对象堆内存内部的地址偏移--通过反射获去Field,使用unsafe的objectFieldOffset获取对应的偏移量。--然后getXXvolatile获取值。

    3、J.U.C java.util.concurrent包

    4、 atomicXX-->cas操作

           

    5、atomicXXFieldUdadater:更新已经存在没有atomic修饰的字段 -- volatile

    6、atomicReference<T>,原子修改引用-compareAndSet

    7、DoubleAccumulator、LongAccumulator、DoubleAdder、LongAdder:内部拆分多个数同步计算,适合多改少读的场景。Accmulator可以传入lambda自定义计算逻辑。

    cas自旋的问题:高频争抢cpu资源,大量长时间的不成功,大量消耗cpu资源。

                               仅支持单个变量

                               ABA问题-----线程a内反复修改,导致本应失败的b线程cas成功。

    atomicstampedreference:除了对比值,还会对比version防止aba问题。

    实现一个简单锁:AtomicReference<Thread> run 标记当前获取到锁的线程。 定义个队列 如linkedblockingqueue,保存等待线程,集成Lock接口LockSupport.park() ;

  • 相关阅读:
    盘点 | 2020年金融科技大事记:监管与后疫情
    2020年业务安全领域12大事件
    安装zsh时git太慢,换代理
    springboot 日志处理 aop
    DataPipeline荣获湾区创见&#183;2020网络安全大会 TECHSPARK 十强奖
    PI-S4 Proxy相关配置
    PI-海外银企直联方案
    Mendix-Websites
    crawler-美国GDP数据预测
    AST-web端javascript逆向杀器之认识AST
  • 原文地址:https://www.cnblogs.com/windghost/p/12292408.html
Copyright © 2011-2022 走看看