Java虚拟机--无锁(十五)

来源:互联网 发布:1683维也纳战役 知乎 编辑:程序博客网 时间:2024/06/04 19:11

  

  • 啥是无锁?
    • 高并发时,"锁"的激烈竞争可能会成为系统瓶颈;无锁使用非阻塞同步的方法,在不使用锁的前提下,确保数据和程序在高并发环境下保持多线程间的一致性。
  • 理解CAS
    • 重申"锁"的同步方式
      • 一种阻塞的线程同步方式,不同线程在锁竞争时,总不能避免相互等待,从而阻塞当前线程;
    • 如何解决这个问题?
      • 那就是非阻塞同步咯。代表是ThreadLocal,每个线程拥有各自独立的变量副本,在并行计算时,无需相互等待;
    • CAS算法
      • 非阻塞,没有死锁,线程之间影响小,系统开销小,没有线程间调度的开销;
      • 算法实现过程:
        • 包含三个参数CAS(V,E,N)V:要更新的变量,E:预期值,N:新值;
        • 仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做;
        • 最后,CAS返回当前V的真实值;
        • 多个线程同时使用CAS操作一个变量时,只有一个会成功更新,其余均会失败;
          • 失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,也允许它放弃操作;
        • 即使没有锁,CAS也可以发现其他线程对当前线程的干扰,并进行处理;
  • 原子操作
    • java.util.concurrent.atomic包下,有对无锁算法实现的原子操作类;
      • 主要有AtomicInteger(整数),AtomicIntegerArray(整数数组),AtomicLong(长整型),AtomicLongArray(长整型数组),AtomicReference(普通对象);
      • 实现机制:在一个死循环中,不断尝试修改目标值,直到修改成功。如果竞争不激烈,会提高修改成功的概率,否则相反;失败次数过多,会影响性能;
  • LongAddr
    • JDK1.8java.util.concurrent.atomic包中新引入了LongAdder类来提高原子类性能。
      • LongAddr的优化思路:将热点数据value分离成多个单元cell,每个cell独自维护内部的值,当前对象的实际值由所有的cell累计合成,就对value进行了有效的分离,提高了并行度
0 0