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() ;

  • 相关阅读:
    【BZOJ 4151 The Cave】
    【POJ 3080 Blue Jeans】
    【ZBH选讲·树变环】
    【ZBH选讲·拍照】
    【ZBH选讲·模数和】
    【CF Edu 28 C. Four Segments】
    【CF Edu 28 A. Curriculum Vitae】
    【CF Edu 28 B. Math Show】
    【CF Round 439 E. The Untended Antiquity】
    【CF Round 439 C. The Intriguing Obsession】
  • 原文地址:https://www.cnblogs.com/windghost/p/12292408.html
Copyright © 2011-2022 走看看