• '实战JAVA虚拟机 JVM故障诊断与性能优化(八)---无锁,CAS理解


      在高并发环境下,对”锁“的激烈竞争可能会成为系统瓶颈,为此,可以使用一种称为非阻塞同步的方式。这种方式不需要使用”锁“(因此称之为“无锁”),但是依然能确保数据和程序在高并发环境下

      保持多线程间的一致性。

    1、理解CAS  

      基于比较并交换(Compare And Swap)CAS算法的无锁并发控制。

      与锁的实现相比,无锁的算法设计和实现都要复杂得多,但由于其非阻塞性,它对于死锁问题天生免疫,并且,线程间的互相影响远远比基于锁的方式小。更为重要的是,使用无锁的方式完全没有锁竞争带来的系统开销,

      也没有线程间调度带来的开销,因此,它要比基于锁的方式拥有更优越的性能。

      CAS算法的过程:它包含3个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。

      最后,CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。当多个线程同时使用CAS操作一个变量时,只有一个会胜出并成功更新,其余均失败。失败的线程不会被挂起,仅是

      被告知失败,并且允许再次尝试,当然允许失败的线程放弃操作。在硬件层面,大部分的现代处理器都已经支持原子化的CAS指令。

    2、原子操作

      CAS操作在JAVA中的应用,在JDK的java.util.concurrent.atomic包下,有一组使用无锁算法实现的原子操作类,主要有,AtomicInteger、AtomicIntegerArray、AtomicLong、AtomicLongArray和AtomicReference等。

    3、将随机变为可控:理解Java内存模型

      Java内存模型(JMM)

      a、原子性

      b、有序性

        现代cpu都支持指令流水线执行。为了保证流水线的顺畅执行,在指令执行时,有可能会对目标指令进行重排。重排不对导致单线程中语义修改,但会导致多线程中的语义出现不一致。

        解决有序性的一个简单方法就是使用  synchronized 关键字。

      c、可见性

        可见性是指一个线程修改了一个变量的值,在另一个线程中可以马上得知这个修改。指令重排就有可能使得一个线程可能无法立即得知一个变量的修改。

  • 相关阅读:
    NOIP2011 D1T1 铺地毯
    NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
    POJ 2513 trie树+并查集判断无向图的欧拉路
    599. Minimum Index Sum of Two Lists
    594. Longest Harmonious Subsequence
    575. Distribute Candies
    554. Brick Wall
    535. Encode and Decode TinyURL(rand and srand)
    525. Contiguous Array
    500. Keyboard Row
  • 原文地址:https://www.cnblogs.com/kaishi/p/7790249.html
Copyright © 2020-2023  润新知