• 高并发多线程二


    1. CAS中的ABA问题
      CAS(V,Expected,NewValue),CAS自旋时,如果操作途中Expected值没有改变则会赋予其新的值(NewValue),如果发生改变则会将改变后的值赋给Expected重新进行上一步操作,但是这中间如果有其他线程将Expected的值改变为N之后又改回Expected,则CAS无法识别,称之为ABA问题,基本数据类型时不会有问题,但是引用数据类型则不行,地址还是原来的地址,但是内容可能会有变化,解决这个问题的方法就是加一个版本号(version),同时检查Expected和version。
    2. CAS中多处是用Unsafe这个类保证安全
      Unsave类,只能调用静态方法(getinstance)获取单例对象,直接操作虚拟机里面的内存,具备C++/C类似的能力,比如allocateMemory(分配内存)
    3. LongAdder  分段并发多线程(分段锁)
    4. synchronized是可重入锁,也就是自己重新进入时如果是自己锁定的,则可以直接进去,称为重入
    5. ReentrankLock是可以替代synchronized的,但是Lock需要手动解锁,最后一定是try-catch-finally{Lock.unlock},防止发生错误永远解不了锁
      1、与synchronized相比,ReentrankLock可以try-lock尝试锁,如果锁不到的话可以继续执行
      2、可以执行lockInterruptibly方法,对interrupt()方法做出响应继续执行,这儿区别于synchronized,synchronized是需要interrupt打断wait()
      3、是公平锁,先来先得(相对于synchronized竞争而言)
    6. Phaser类,维护着阶段这个变量,
    7. 互斥锁(排它锁),
    8. 日常工程一般不写新的锁,多数用synchronized这种老锁,除非特别追求效率
    9. Semaphore  信号灯,Semaphore s = new Semaphore(N,fair),赋予值N后,每次线程运行时获取s.acquire(),s值都会减小1,线程运行结束时释放s.release(),加1,s减小到0线程则等待,这样保证了同时运行的线程数量不超过N(限流的作用),可以理解只有N条车道,当赛车(线程)很多时最多只能N辆车运行。fair值可有可没有,没有的话默认不公平,如果设置为true则公平,表示队列里线程会排序进入车道(s.acquire())
    10. Exchanger,交换器,假设第一个线程有一个字符串S1,第二个线程有一个字符串S2,当线程内部调用exchanger(s)后,达到两个线程交流交换字符串的目的。
    11. CyclicBarriar,多个线程相互等待,直到都满足条件之后,才能执行后续的操作。CyclicBarrier描述的是各个线程之间相互等待的关系。(以后补充)

  • 相关阅读:
    numpy函数:[6]arange()详解
    python中的list和array的不同之处
    python 矩阵转置transpose
    PowerDesigner(一)-PowerDesigner概述(系统分析与建模)
    MDX中Filter 与Exist的区别
    SQL Server 2016 —— 聚集列存储索引的功能增强
    SQL Server 2016:内存列存储索引
    PXE
    setjmp
    skb head/data/tail/end/介绍
  • 原文地址:https://www.cnblogs.com/Courage129/p/12721624.html
Copyright © 2020-2023  润新知