zoukankan      html  css  js  c++  java
  • concurrent之CAS

    你的对手在看书,你的仇人在磨刀,你的闺蜜在减肥,隔壁老王在练腰
    

      CAS是什么?

      比较并交换,compareAndSet,类似于版本冲突,如果主物理内存和线程中的数据是否相等,则进行交互

      实际应用的类型,AtomicInteger(原子整型),AtomicReference(自定义原子类型) 

    CAS底层原理:
      比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较直到主内存和工作内存中的值一致为止  

      unsafe:是CAS的核心类,只能通过本地方法访问,可以直接操作特定内存数据,底层compareAndSwapInt
      变量valueOffset,表示变量值在内存中偏移地址,Unsafe就是根据内存偏移地址获取数据
      
      是一条CPU的原子指令,直接操作内存,不会造成数据不一致问题

    缺点:
      极端情况,如果CAS长时间一直不成功,会给CPU带来很大的开销,使用的是do while
      只能保证一个变量的原子操作
      引出ABA问题,在当前时刻比较,这个时间差会导致数据的变化

    解决ABA问题:
      添加时间戳

    ReentrantLock锁线程:

      默认非公平锁,是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁在并发的情况下,有可能会造成优先级反转

      公平锁是按照申请锁的顺序来获取锁,类似排队打饭

      可重入锁

    Synchronized锁对象和类

      也是非公平锁

      可重入锁

    可重入锁(递归锁):

      是指同一线程外层函数获取锁之后,内层递归函数仍然能获取该锁,在内层方法自动获取锁

    自旋锁

      尝试获取锁的线程,不会立即阻塞,而是采用循环的方式去尝试获取锁,避免线程的上下文切换,缺点会消耗cpu

      while (!atomicReference.compareAndSet(null, thread)) 

    独占锁(可写), 共享锁(可读),互斥锁(读写锁)

    ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
           rwLock.writeLock();
           rwLock.readLock();

    CountDownlatch

      await:进行阻塞

    CyclicBarrier

       

    atomicInteger.compareAndSet(1, 100);

     atomicInteger.get();

      

      

    Unkonw Unkonw(你不知道一样东西,你也会不知道自己不知道这样东西)
  • 相关阅读:
    [一个经典的多线程同步问题]解决方案二:Event事件
    [进程与线程]进程、线程的生活
    从C++strStr到字符串匹配算法
    Dubbo 服务集群容错配置
    TCP三次握手
    zookeeper 学习 客户端Acl操作笔记
    ubuntu下的“用vim打开中文乱码,用cat打开正常显示”的解决方法
    JDK1.7 Update14 HotSpot虚拟机GC收集器
    账户信息不存在的问题
    win10 64 使用 visual studio 2017 搭建汇编开发环境
  • 原文地址:https://www.cnblogs.com/2014-1130/p/15399265.html
Copyright © 2011-2022 走看看